如何仅使用 Windows 命令外壳查找文件大小?
Posted
技术标签:
【中文标题】如何仅使用 Windows 命令外壳查找文件大小?【英文标题】:How can I find the file size only using the windows command shell? 【发布时间】:2011-05-02 14:58:33 【问题描述】:我正在尝试编写一个脚本来检查文件的大小是否大于 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.
关于我做错了什么有什么想法吗?
【问题讨论】:
【参考方案1】:试试这个命令:
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 是以字节为单位的文件大小...
【讨论】:
【参考方案2】:如果您想在 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
块在这方面是一个单一的声明。因此,一旦循环从 before 运行 size
的值,就会使用循环。
延迟扩展(使用!
)将在执行之前而不是在解析语句时扩展变量,因此您将在循环中看到更新的值。
【讨论】:
【参考方案3】:robocopy /L (你想要大小的目录) (C:\arbitrary folder) . /Log:(C:\arbitrary folder\robolog.txt)
这将创建一个大小为 findstr 字节 C:\robocopylog.txt >>getsize.txt
你可以使用 For /?帮助导航到 getsize.txt 的最后一个条目,该条目应该包含整个目录的大小。 您将不得不处理是 k 表示兆字节 m 还是 g 表示 Gigs 这可以解决,因为 robocopy 使用 0 作为占位符,因此您只需要获取最后一行的第三个和第四个令牌。 514.46 米
【讨论】:
【参考方案4】:我不确定为什么会导致问题,但这段代码有效。
for %%i in (*.txt) do (
echo %%i %%~zi
echo %%~zi
if %%~zi GTR 0 echo greater
)
我认为这与 %size% 变量何时被替换和重置有关。我仍然想用变量名替换%%~zi
,但我想如果它有效,我会留下它。
【讨论】:
【参考方案5】:以下是如何在 PowerShell 中执行此操作。我希望它能说服你升级到更现代的 shell:
PS C:\test> Get-ChildItem *.txt | ForEach-Object Write-Host $_.name, $_.length
test.txt 16
test2.txt 5
【讨论】:
以上是关于如何仅使用 Windows 命令外壳查找文件大小?的主要内容,如果未能解决你的问题,请参考以下文章