Как вызвать CMD.EXE из PowerShell с пробелом в имени каталога указанной команды - PullRequest
14 голосов
/ 24 июня 2011

У меня есть следующий скрипт PowerShell для проверки моих 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's 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 Ответ

17 голосов
/ 24 июня 2011

Вам нужно вызвать 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%"
...