2012-03-02 58 views
15

He buscado por todas partes y probado diferentes variaciones de comandos, pero todavía no estoy allí.Powershell Ejecutar el exe remoto con argumentos de la línea de comando en la computadora remota

Mi objetivo es ejecutar un exe que ya reside en una máquina remota y pasar los argumentos de la línea de comandos. He intentado invocar-comando, pero parece que no puedo obtener mi sintaxis para reconocer los argumentos.

métodos probados:

  1. Win32_Process.Create()
  2. Invoke-Command
  3. Start-Proceso
  4. [diagnostics.process] :: iniciar
  5. Invoke-WmiMethod

De mis pruebas, lo más cerca que puedo llegar es con el siguiente comando:

$command = "program.exe -r param" 
Invoke-Command -ComputerName $server -ScriptBlock {$command} 

El comando se completa sin error o código de retorno, pero en la máquina remota no se ejecutó con argumentos. He jugado con comillas simples/dobles para ver si hay algún cambio, pero ninguno.

Respuesta

19

¿Usted intentó utilizar el -ArgumentList parámetro:

invoke-command -ComputerName studio -ScriptBlock { param ($myarg) ping.exe $myarg } -ArgumentList localhost 

http://technet.microsoft.com/en-us/library/dd347578.aspx

Un ejemplo de invocar un programa que no está en el camino y tiene un espacio en el que es ruta de la carpeta:

invoke-command -ComputerName Computer1 -ScriptBlock { param ($myarg) & 'C:\Program Files\program.exe' -something $myarg } -ArgumentList "myArgValue" 

Si el valor del argumento es estático, puede proporcionarlo en el bloque de script de esta manera:

invoke-command -ComputerName Computer1 -ScriptBlock { & 'C:\Program Files\program.exe' -something "myArgValue" } 
+0

Gracias por la respuesta rápida. Por alguna razón, cuando lo intento de esa manera, obtengo que imprima el comando expandido que funcionaría si lo ejecutara manualmente, pero en realidad no lo está ejecutando. Tuve que eliminar el "&" como decía que era un personaje reservado para uso futuro. – gregs

+0

@gregs Tuve que habilitar la comunicación remota en mi máquina para probarla. Cambié el comando a una prueba de ping simple enviando un argumento de localhost. El anterior éxito para mí. –

+0

Pude haber resuelto el problema, pero no la solución. Esta línea funciona si uso ping.exe y "localhost" como arg, pero tengo que poner comillas alrededor de mi ruta ejecutable ya que la ruta tiene espacios. Cuando hago eso, simplemente escucha mi cadena entre comillas, pero no creo que se ejecute. – gregs

-2
$sb = ScriptBlock::Create("$command") 
Invoke-Command -ScriptBlock $sb 

Esto debería funcionar y no inducir a error a los principiantes.

3

¿Está tratando de pasar los argumentos de la línea de comando al programa AS cuando lo ejecuta? Estoy trabajando en algo ahora que hace exactamente esto, y fue mucho más simple de lo que pensaba. si entro en la línea de comandos y escriba

C:\folder\app.exe/xC:\folder\file.txt 

entonces mis inicia la aplicación, y crea un archivo en el directorio especificado con el nombre especificado.

que quería hacer esto a través de un script de PowerShell en una máquina remota, y dado cuenta de que todo lo que tenía que hacer era poner

$s = New-PSSession -computername NAME -credential LOGIN 
    Invoke-Command -session $s -scriptblock {C:\folder\app.exe /xC:\folder\file.txt} 
Remove-PSSession $s 

(Tengo un montón comandos más similares dentro de la sesión, esto es solo el mínimo que se requiere para ejecutar) observe el espacio entre el ejecutable y los argumentos de la línea de comando. Funciona para mí, pero no estoy seguro de cómo funciona exactamente tu aplicación, o si es así incluso cómo le pasas los argumentos.

* También puedo tener mi solicitud empujar el archivo de nuevo a mi propio equipo local cambiando el guión de bloque a

C:\folder\app.exe /x"\\LocalPC\DATA (C)\localfolder\localfile.txt" 

Usted necesita las comillas si el archivo de la ruta tiene un espacio en él.

EDITAR: en realidad, esto planteó algunos problemas tontos con Powershell lanzando la aplicación como un servicio o algo, así que hice algunas búsquedas, y descubrí que puede llamar a CMD para ejecutar comandos para usted en la computadora remota. De esta manera, el comando se lleva a cabo EXACTAMENTE como si acabara de escribirlo en una ventana de CMD en la máquina remota. Coloque el comando en el scriptblock en comillas dobles, y luego coloque un cmd.exe/C antes. como este:

cmd.exe /C "C:\folder\app.exe/xC:\folder\file.txt" 

esto resolvió todos los problemas que he tenido recientemente.

EDITAR EDITAR: Tuve más problemas y encontré una forma mucho mejor de hacerlo.

start-process -filepath C:\folder\app.exe -argumentlist "/xC:\folder\file.txt" 

y esto no cuelga la ventana del terminal esperando a que finalice el proceso remoto. Solo asegúrese de tener una forma de finalizar el proceso si no lo hace por sí mismo. (el mío no, requirió la codificación de otro argumento)

+0

La mejor respuesta –

-1
$sb = [scriptblock]::create($command) 
+2

¡Bienvenido a StackOverflow! Tal vez podría agregar alguna explicación, podría ser útil para la persona que hizo la pregunta. –

Cuestiones relacionadas