防止在批处理文件中解释多行命令

时间:2018-12-20 22:56:11

标签: powershell batch-file

我试图在批处理文件中使用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

应该只打印每个文件夹的名称,然后打印文件夹的大小。目前,它会将{$ _解释为命令。

1 个答案:

答案 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语句将其称为& { ... }