gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:19:55 25 4
gpt4 key购买 nike

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

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

最佳答案

以下应该做您想要的:

@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%-。
  • 行尾的^是不包含换行符的行延续,因此break语句必须以;开头才能使语法有效。
  • 因为稍后必须在变量中加上"..."来传递变量,所以避免"字符更容易。在变量值中。
  • 要将每个目录路径作为参数传递给PowerShell代码,请将switch语句括在& { ... }中,该语句允许switch语句将其引用为$args[0]
  • 关于powershell - 防止在批处理文件中解释多行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877157/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com