Как вызвать CMD.EXE из PowerShell с пробелом в имени указанной команды

У меня есть следующий PowerShell script для проверки моих репозиториев SVN:

$SVNAdminDir = 'C:\Program Files (x86)\VisualSVN Server\bin';
$RepositoryDir = 'C:\My Repositories\App1';
$_cmd = "`"$SVNAdminDir`\svnadmin`" verify `"$RepositoryDir`"";
Write-Host $_cmd; # Copying this into the command prompt runs without an issue...
cmd.exe /c $_cmd; # It when I try to execute the command from PS that I get the error.

Но когда я пытаюсь выполнить его, я получаю следующее сообщение об ошибке:

cmd.exe : 'C:\Program' is not recognized as an internal or external command,
At line:5 char:12
+     cmd.exe <<<<  /c $_cmd;
    + CategoryInfo          : NotSpecified: ('C:\Program' is...ternal command,:String) [],     RemoteException
    + FullyQualifiedErrorId : NativeCommandError

operable program or batch file.

Поскольку я по существу устанавливаю $cmd = '"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" verify "C:\My Repositories\App1"'; с двойными кавычками внутри одинарных кавычек, я ожидал, что пробел в C:\Program Files (x86) \... будет передан правильно.

Я подозреваю, что есть что-то тривиальное со строкой, которую мне не хватает...

Ответ 1

Вам нужно вызвать cmd.exe следующим образом:

cmd.exe /c "`"$_cmd`""

Команды, которые вы отправляете на cmd.exe, должны быть полностью завернуты в свои собственные кавычки, а не только пути с пробелами, которые являются частью этих команд. Это связано с тем, как Powershell анализирует строку, и ей нужно передать литеральные кавычки на cmd.exe, чтобы она, в свою очередь, правильно обрабатывала содержимое двойных кавычек.

Например, если вы уже были в сеансе cmd.exe и задаете такую ​​переменную:

C:\>set _cmd="C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" verify "C:\My Repositories\App1"

Тогда простое расширение этой переменной в командной строке будет работать:

C:\>%_cmd%

Однако, если передать его в новый сеанс cmd.exe, ему также потребуются дополнительные кавычки:

C:\>cmd.exe /c "%_cmd%"