2011-06-24 76 views
13

tengo el siguiente script de PowerShell para la verificación de mis repositorios SVN:Cómo llamar cmd.exe de PowerShell con un espacio en el nombre del directorio especificado del Comando

$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. 

Pero cuando intento ejecutarlo, estoy recibir el siguiente mensaje de 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. 

Desde que estoy esencialmente el establecimiento de $cmd = '"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" verify "C:\My Repositories\App1"'; con las comillas dobles dentro de las comillas simples, que estaba esperando en el espacio C: \ archivos de programa (x86) \ ... para ser pasado correcto ly.

sospecho que hay algo trivial con la cadena que me falta ...

Respuesta

15

es necesario llamar a cmd.exe así:

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

Los comandos se envían a cmd.exe necesitan ser envueltos en su totalidad en sus propias citas, no solo en las rutas con espacios que forman parte de esos comandos. Esto tiene que ver con cómo Powershell analiza la cadena y necesita pasar citas literales al cmd.exe para que a su vez realice su propio análisis del contenido de las comillas dobles correctamente.

Por ejemplo, si ya estuviera en una sesión cmd.exe y establecer una variable de la siguiente manera:

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

Después, simplemente ampliando esa variable en la línea de comandos funcionaría:

C:\>%_cmd% 

Sin embargo, si pasándolo a una nueva sesión cmd.exe, también necesitaría cotizaciones adicionales:

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

cmd.exe/c "\' "$ _ cmd \' "" ¡Eso funcionó! ¡Gracias! :-) –

+0

No he podido hacer que esto funcione en PowerShell. 'cmd.exe' continuamente comete errores al quejarse de que' 'C: \ Program 'no se reconoce como un comando interno o externo ...'. Estoy ejecutando PowerShell 5.1. ¿Algunas ideas? – STLDeveloper

Cuestiones relacionadas