我如何仅使用Windows命令外壳找到文件大小?

问题描述 投票:4回答:5

我正在尝试编写一个脚本,该脚本检查文件的大小是否大于0,如果大于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.

关于我在做什么错的任何想法?

windows command-line find dos filesize
5个回答
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
投票

如果要在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值,便会使用该循环。

延迟扩展(使用!)将在执行之前而不是在解析语句时扩展变量,因此您将在循环中看到更新的值。


1
投票

robocopy / L(您想要的目录大小)(C:\任意文件夹) / Log:(C:\任意文件夹\ robolog.txt)

将创建具有以下大小的文档findstr字节C:\ robocopylog.txt >> getsize.txt

您可以使用For /?帮助导航到getsize.txt的最后一个条目,该条目应包含整个目录的大小。您将必须处理k表示兆字节的千字节m还是兆字节的g数,这可以解决,因为robocopy使用0作为占位符,因此您只需要获取最后一行的第3和第4个标记。 514.46 m


0
投票

我不确定为什么会导致此问题,但是此代码有效。

for %%i in (*.txt) do (
echo %%i %%~zi
echo %%~zi
if %%~zi GTR 0 echo greater
)

我认为这与%size%变量被替换和重置有关。我仍然想将%%~zi替换为变量名,但我认为如果可行,我将保留它。


0
投票

有关在PowerShell中执行此操作的方法。我希望它能说服您升级到更现代的外壳:

PS C:\test> Get-ChildItem *.txt | ForEach-Object { Write-Host $_.name, $_.length }
test.txt 16
test2.txt 5
© www.soinside.com 2019 - 2024. All rights reserved.