Powershell 用于比较一个文件的文件大小的脚本

Powershell 用于比较一个文件的文件大小的脚本,powershell,batch-file,for-loop,Powershell,Batch File,For Loop,我试图写一个脚本,告诉我如果一个文件大小大于一个数字,下面是我写的脚本,但它一直显示1999,即使我知道文件大小大于这个数字 @echo off setlocal enabledelayedexpansion for /f "delims=" %%a in (' powershell -c "(Get-ChildItem -Recurse "C:\XSTOREDB\xstore_data.mdf" | Measure-Object -Property Length -Sum).Sum" ')

我试图写一个脚本,告诉我如果一个文件大小大于一个数字,下面是我写的脚本,但它一直显示1999,即使我知道文件大小大于这个数字

@echo off
setlocal enabledelayedexpansion

for /f "delims=" %%a in (' powershell -c "(Get-ChildItem -Recurse "C:\XSTOREDB\xstore_data.mdf" | Measure-Object -Property Length -Sum).Sum" ') do set "foldsize=%%a"

if "!foldsize!" GTR "6000000000" (
    exit /B 0
) else (
    exit /B 1999
)
endlocal

我很确定你有两个问题。第一个问题是,您正在按字母顺序进行比较。因此,
“7”
将被视为
GTR
“600000000”

第二个问题是cmd中的数字操作被限制为32位整数。您可以使用的最大数字是2^31-1,即2147483647,这已经小于您感兴趣的数字

这里的典型解决方法是比较字符串的“重要”部分,或者截断N个最低有效位

下面是一个快速的示例。它可能包含实施中的问题/错误。我执行了
echo exit/b
,因此脚本将运行,您可以看到结果,而不是实际的
exit/b

@echo关闭
延迟扩展
rem首先,我们将检查右侧的第10位和第11位数字
设置foldsize=700000100
rem如果第11点有任何数字,那么它必须更大
如果不是“!foldsize:~0,-10!”==”(
rem该数字至少为1000000000,大于1000000000,因此我们退出
回声退出/b0
)
rem检查第10位数字是否为6或更大
rem添加零以避免未定义变量的问题
设置smallfoldsize=!折叠大小:~0,-9!
如果!smallfoldsize!0全球技术法规50(
从技术上讲,这个数字现在大于或等于600000000
雷姆,如果你真的需要它比我更大,我会把它留给你
回声退出/b0
)否则(
雷姆:它比较小
回声出口/B 1999
)
rem另一种方法是丢弃N个最低有效位
rem我去掉最后7个数字,然后加一个零以避免
rem是一个未定义的变量
设置smallfoldsize=!折叠大小:~0,-7!0
如果!smallfoldsize!GEQ 6000(
回声退出/b0
)否则(
回声出口/B 1999
)
雷姆,这是实际的大于或等于。如果你
rem需要大于,你必须看得更少
smallfoldsize=6000时的rem有效数字
在解释您的方法的基本问题方面做得很好(词汇而不是数字比较,数字太大)

如果您的比较不需要精确到字节级别,您可以尝试以下方法,这可以实现更简单的解决方案:

  • 使PowerShell以mebibytes(MiB)而不是字节返回值

  • 这应该返回一个足够小的数字,您可以与
    cmd
    GTR
    操作符进行比较(数字)

请注意PowerShell命令如何将结果除以
1mb
(1 MiB(mebibyte)=2^20=
1048576
字节),然后通过

还要注意嵌入的
字符是如何作为
\”
转义的,以确保PowerShell能够看到它们


最后,请注意,作为一个小优化,
-File
是如何传递给
Get-ChildItem
cmdlet的,以便跳过目录(目录本身,而不是其文件),因为目录本身没有
Length
属性。

尽管您的问题正文、文本和标题与您提供的代码不匹配,我认为没有必要为这项任务提供支持

如果文件
C:\XSTOREDB\xstore_data.mdf
大于
6GB,则根据问题正文文本和标题退出,错误级别为
0

@“%\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
根据您的问题代码,如果目录
C:\XSTOREDB
总计超过
6GB
,则以
0
的错误级别退出:

@“%\uuuuuAppDir\uuuuuu%WindowsPowerShell\v1.0\powershell.exe”-NoP”If(测试路径-L“C:\XSTOREDB”){(GCI“C:\XSTOREDB”-Rec Measure Length-Su-EA Stop).Sum-GT 6GB}“2>num“%\uuuuuuuuuAppDir\uuuuu%find.exe”>NUL&(Exit/b0)| Exit/b1999

下面是一些您想做的事情的示例嗯,呃。。。为什么要将Bat/CMD与powershell混合使用?这是很容易做到的豪华所有它自己。嗯,最大的数字是2^31-1,这等于2147483647。。。
@echo off
setlocal enabledelayedexpansion

for /f "delims=" %%a in ('
powershell -noprofile -c ^
  "[math]::Ceiling((Get-ChildItem -File -Recurse \"C:\XSTOREDB\xstore_data.mdf\" | Measure-Object -Property Length -Sum).Sum / 1mb)"
') do set "foldsize=%%a"

:: # 6000000000 bytes is ca. 5722 MB
if !foldsize! GTR 5722 (
    exit /B 0
) else (
    exit /B 1999
)