开发者

How can I find the file size only using the windows command shell?

I'm trying to write a script that checks if the size of a file is greater than 0 and if so, prints "greater". I looked at this question and got some good ideas. I tried to implement what the second answerer answered, but it's not working properly.

Thi开发者_如何学编程s is what I have so far:

for %%i in (*.txt) do (
set size=0
set /A size=%%~zi
echo %%i %size%
if %size% GTR 0 echo greater
)

When I try this, it keeps giving me the same size for all the files, even though I know that one of them is different. When I remove the set size=0, if the file size is 0, it gives an error 0 was unexpected at this time.

Any ideas about what I'm doing wrong?


Try this command:

for %%I in (*.txt) do @echo %%~znI

When I run this, I get the following result on Windows 7:

C:\Users\Leniel\Desktop>for %I in (*.txt) do @echo %~znI
14 test1
34 test2

where 14 and 34 is the file size in bytes...


If you want to use an actual environment variable inside that for block, you need delayed expansion:

setlocal enabledelayedexpansion

for %%i in (*.txt) do (
  set size=0
  set /A size=%%~zi
  echo %%i !size!
  if !size! GTR 0 echo greater
)

Note also that you need to replace %size% by !size! to trigger delayed expansion instead of the normal one.

The problem is that normal environment variables are expanded when a statement is parsed; the for block is a single statement in that regard. So once the loop runs the value of size from before the loop is used.

Delayed expansion (with !) will expand the variables right before execution instead of when a statement is parsed so you will see the updated value from within the loop.


robocopy /L (dir you want the size of) (C:\arbitrary folder) . /Log:(C:\arbitrary folder\robolog.txt)

That wil create a document that has the size findstr Bytes C:\robocopylog.txt >>getsize.txt

You can use For /? to help navigate to the last entry of getsize.txt which should contain the size of the entire directory. You will have to handle whether it is k for Kilo m for mega bytes or g for Gigs Which can be solved since robocopy uses 0 as place holders so you would only need to get the 3rd and 4th token of the last line. 514.46 m


I'm not sure why this caused the problem, but this code worked.

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

I think it had to do with when the %size% variable was getting replaced and reset. I'd still like to replace the %%~zi with a variable name, but I think I'll leave it if it works.


Here's how to do it in PowerShell. I hope it convinces you to upgrade to a more modern shell:

PS C:\test> Get-ChildItem *.txt | ForEach-Object { Write-Host $_.name, $_.length }
test.txt 16
test2.txt 5
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜