我正在尝试编写一个脚本来检查文件的大小是否大于0,如果是,则打印“更大”。我看了this问题并得到了一些好主意。我试图实现第二个回答者回答的问题,但它没有正常工作。
这是我到目前为止所做的:
for %%i in (*.txt) do (
set size=0
set /A size=%%~zi
echo %%i %size%
if %size% GTR 0 echo greater
)
当我尝试这个时,它会为所有文件保持相同的大小,即使我知道其中一个是不同的。当我删除set size=0
时,如果文件大小为0,则会出现错误0 was unexpected at this time.
关于我做错了什么的任何想法? TIA!
答案 0 :(得分:2)
尝试此命令:
for %%I in (*.txt) do @echo %%~znI
当我运行它时,我在Windows 7上得到以下结果:
C:\Users\Leniel\Desktop>for %I in (*.txt) do @echo %~znI
14 test1
34 test2
其中14和34是文件大小,以字节为单位......
答案 1 :(得分:1)
如果要在for
块内使用实际环境变量,则需要延迟扩展:
setlocal enabledelayedexpansion
for %%i in (*.txt) do (
set size=0
set /A size=%%~zi
echo %%i !size!
if !size! GTR 0 echo greater
)
另请注意,您需要将%size%
替换为!size!
以触发延迟扩展而不是正常扩展。
问题是当语句解析时会扩展正常的环境变量;在这方面,for
块是一个单一的声明。因此,一旦循环在之前从运行size
的值,就会使用循环。
延迟扩展(使用!
)将在执行之前扩展变量,而不是在解析语句时,因此您将在循环中看到更新的值。
答案 2 :(得分:1)
robocopy / L(dir你想要的大小)(C:\任意文件夹)。 / Log:(C:\ arbitrary folder \ robolog.txt)
那将创建一个具有大小的文档 findstr字节C:\ robocopylog.txt>> getsize.txt
你可以使用For /?帮助导航到getsize.txt的最后一个条目,该条目应该包含整个目录的大小。 你将不得不处理kil表示千兆字节是k还是g表格gig可以解决,因为robocopy使用0作为占位符所以你只需要得到最后一行的第3和第4个标记。 514.46米
答案 3 :(得分:0)
我不确定为什么会导致这个问题,但这段代码有效。
for %%i in (*.txt) do (
echo %%i %%~zi
echo %%~zi
if %%~zi GTR 0 echo greater
)
我认为这与%size%变量被替换和重置时有关。我仍然想用变量名替换%%~zi
,但我想如果它有效,我会留下它。
答案 4 :(得分:0)
以下是在PowerShell中执行此操作的方法。我希望它能说服你升级到更现代的外壳:
PS C:\test> Get-ChildItem *.txt | ForEach-Object { Write-Host $_.name, $_.length }
test.txt 16
test2.txt 5