我试图在批处理文件中使用here中的powershell命令。我希望它遍历一个文件夹,打印每个文件夹的名称和大小。我的代码无法正常工作了吗?
我尝试在所有地方都使用引号。我也尝试过使用转义字符。也许是因为我刚开始编写批处理文件,但我无法弄清楚。
@echo off
set "my_path=%~dp0"
set file_size_command=switch((ls -r|measure -s Length).Sum) {^
{$_ -gt 1GB} {'{0:0.0} GiB' -f ($_/1GB)^
break}^
{$_ -gt 1MB} {'{0:0.0} MiB' -f ($_/1MB)^
break}^
{$_ -gt 1KB} {'{0:0.0} KiB' -f ($_/1KB)^
break}^
default { "$_ bytes" }^
}
for /d %%a in ("%my_path%\*") do (
echo Folder name: %%~nxa
PowerShell.exe -noexit -command %file_size_command%
)
pause
rem Let the user view this
应该只打印每个文件夹的名称,然后打印文件夹的大小。目前,它会将{$ _解释为命令。
答案 0 :(得分:3)
以下应做您想做的事:
@ActivityScoped
所有@echo off
set "my_path=%~dp0"
set file_size_command=^& { switch^(^(ls -r $args[0] ^|measure -s Length^).Sum^) {^
{$_ -gt 1GB} {'{0:0.0} GiB' -f ^($_/1GB^)^
; break}^
{$_ -gt 1MB} {'{0:0.0} MiB' -f ^($_/1MB^)^
; break}^
{$_ -gt 1KB} {'{0:0.0} KiB' -f ^($_/1KB^)^
; break}^
default { $_.ToString() + ' bytes' }^
} }
for /d %%a in ("%my_path%\*") do (
echo Folder name: %%~nxa
PowerShell.exe -noprofile -command "%file_size_command%" "%%~fa"
)
元字符-特别是cmd.exe
-必须在( ) & |
变量值中转义^
。
行尾的%file_size_command%
是不包含换行符的行延续,因此您的^
语句必须以{{1 }},以使语法有效。
因为稍后必须在变量前加上break
来传递变量,所以避免使用;
字符会更容易。在变量值中。
要将每个目录路径作为 argument 传递到PowerShell代码,请将"..."
语句括在"
中,该语句允许使用switch
语句将其称为& { ... }
。