防止批处理文件中的多行命令被解释。
防止批处理文件中的多行命令被解释。
我试图在批处理文件中使用来自这里的powershell命令。我希望它可以循环遍历一个文件夹,打印每个文件夹的名称和大小。我的代码有什么问题导致它无法工作?\n我尝试过在各个位置使用引号。我还尝试使用转义字符。也许是因为我刚开始写批处理文件,所以我弄不明白。\n
@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 文件夹名称:%%~nxa PowerShell.exe -noexit -command %file_size_command% ) pause rem 让用户查看这个
\n它应该只打印每个文件夹的名称,然后是文件夹的大小。目前,它将{$_解释为一个命令。
防止批处理文件中的多行命令被解释的问题是由以下原因引起的:
1. 在%file_size_command%变量值中,需要使用^对所有cmd.exe元字符进行转义,特别是( ) & |等字符。
2. 在一行的末尾使用^进行行延续,但^不包括换行符,因此必须在break语句之前加上;以确保语法有效。
3. 为了方便起见,避免在变量值中使用"字符,因为变量稍后需要通过"..."进行传递。
4. 为了将每个目录路径作为参数传递给PowerShell代码,将switch语句放在& {...}中,这样switch语句可以将其作为$args[0]引用。
以下是解决方法的完整代码:
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"
)
希望这篇文章对解决防止批处理文件中的多行命令被解释的问题有所帮助。