如何仅使用 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 命令外壳查找文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

查找所有类似名称文件的脚本(仅区分大小写?)

sqlite3 的 Windows 命令提示符外壳

find命令文件名后缀以及Linux和Windows互传文件

Linux 命令:如何仅“查找”文本文件?

Linux文件查找Day.13

如何使用 Windows 命令行环境查找和替换文件中的文本?