En el caso fácil, pasar argumentos a un exe nativo es tan simple como usar un comando integrado:
PS> ipconfig /allcompartments /all
Puede se encuentra con problemas cuando especifica una ruta completa a un EXE y esa ruta contiene espacios. Por ejemplo, si ve esto PowerShell:
PS> C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe -k .\pubpriv.snk
interpreta el comando a ser "C: \ Program" y "Files \ Microsoft" como primer parámetro, "SDKs \ Windows \ v7.0 \ Bin \ sn. exe" como el segundo parámetro, etc. la solución simple es poner la ruta en una cadena de usar el operador de invocación &
para invocar el comando llamado por el camino por ejemplo:
PS> & 'C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin\sn.exe' -k .\pubpriv.snk
la siguiente área nos encontramos con problemas con es cuando los argumentos son complejos y/o usan caracteres que PowerShell interpreta especialmente ej .:
PS> sqlcmd -v user="John Doe" -Q "select '$(user)' as UserName"
Esto no funciona y podemos depurar esto utilizando una herramienta del PowerShell Community Extensions llamada echoargs.exe
que muestra exactamente cómo el EXE nativo recibe los argumentos de PowerShell.
PS> echoargs -v user="John Doe" -Q "select '$(user)' as UserName"
The term 'user' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, ...
<snip>
Arg 0 is <-v>
Arg 1 is <user=John Doe>
Arg 2 is <-Q>
Arg 3 is <select '' as UserName>
Tenga en cuenta que con Arg3 $(user)
se interpreta & evaluado por PowerShell y da como resultado una cadena vacía. Puede solucionar este problema y un buen número de problemas similares mediante el uso de comillas simples en lugar de qoutes dobles a menos que realmente necesita PowerShell para evaluar un ejemplo de variable:
PS> echoargs -v user="John Doe" -Q 'select "$(user)" as UserName'
Arg 0 is <-v>
Arg 1 is <user=John Doe>
Arg 2 is <-Q>
Arg 3 is <select $(user) as UserName>
Si todo lo demás falla, utilizar una cuerda y aquí Inicio- proceso de esta manera:
PS> Start-Process echoargs -Arg @'
>> -v user="John Doe" -Q "select '$(user)' as UserName"
>> '@ -Wait -NoNewWindow
>>
Arg 0 is <-v>
Arg 1 is <user=John Doe>
Arg 2 is <-Q>
Arg 3 is <select '$(user)' as UserName>
Nota si está utilizando PSCX 1.2 tendrá que anteponer Puesta en proceso como tal - Microsoft.PowerShell.Management\Start-Process
utilizar una función de puesta en proceso de cmdlet de PowerShell.
Ten cuidado con '& 'C: \ archivos de programa \ someapp \ somecmd.exe" -arg $ allArgs' - el '-arg' no es necesario a menos que tengas la intención de pasar' -arg' como parámetro a algunoscmd .exe. –
Sí, por la razón que sea que me he referido a esto hoy, ¡y noté que la línea de código con el -arg no funcionaba! Oops/eliminado. –