Предотвращение интерпретации многострочной команды в командном файле - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь использовать команду powershell из здесь в командном файле.Я хочу, чтобы он просматривал папку, печатая имя и размер каждой папки.Что мне не хватает в моем коде, чтобы заставить его работать?

Я пытался использовать цитаты повсюду.Я также пытался использовать escape-символы.Возможно, это потому, что я новичок в написании командных файлов, но не могу понять.

@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 голосов
/ 21 декабря 2018

Следующее должно делать то, что вы хотите:

@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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...