Как вызвать 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%"