2011-12-17 19 views
7

Deseo utilizar Powershell para llamar a un archivo por lotes en máquinas remotas. Este archivo por lotes tiene argumentos. Esto es lo que tengo hasta ahora:Uso de Invoke-Command de Powershell para llamar a un archivo por lotes con argumentos

$script = "\\fileshare\script.cmd" 
$server = $args[0] 
$args [string]::join(',',$args[1 .. ($args.count-1)]) 

Invoke-Command -computername $server {$script + ' ' + $args} 

Después de un poco de búsqueda, he encontrado que la función Invoke-Command sigue su ScriptBlock en un proceso totalmente nuevo, por lo que no se puede poner las variables en ella (que ganó' t ampliarse). Para eso es la etiqueta -ArgumentList. Así que probé este lugar ...

Invoke-Command -computername $server {\\fileshare\script.cmd} -ArgumentList "FirstArgument" 

que no funcionaron bien ... mi escritura de la hornada me dice que no es que se pasa ningún argumento. No puedo encontrar nada que lo diga explícitamente, pero parece que el parámetro -ArgumentList solo funciona en los scripts de Powershell (no los enviará a un script por lotes).

Alguna idea de cómo puedo usar Invoke-Command para llamar a un archivo por lotes con argumentos?

Respuesta

6

Cuando se pasa a la lista de argumentos el scriptblock, intente "recibirlos" usando una directiva PARAM. De esta manera:

Invoke-Command -computername $server {PARAM($myArg) \\fileshare\script.cmd $myArg} -ArgumentList "FirstArgument" 

o simplemente puede usar el $ args variable automática:

Invoke-Command -computername $server {\\fileshare\script.cmd $args} -ArgumentList "FirstArgument" 
+0

¡Gracias que lo hizo! Eso es incluso lo que dice hacer en la documentación de TechNet para Invoke-Command, ¡así que estoy un poco avergonzado de no poder resolverlo por mi cuenta! Sin embargo, ese poco de $ args es útil. –

3

Los argumentos se pasarán como argumentos al scriptblock y no directamente a su cmd. Que tiene que hacer:

Invoke-Command {param($script,$arg1) &$script $arg1 } -computername $server -ArgumentList $script,"FirstArgument" 

o

Invoke-Command {&$args[0] $args[1] } -computername $server -ArgumentList $script,"FirstArgument" 

PD: No sé lo que está haciendo con $args [string]::join(',',$args[1 .. ($args.count-1)]), es un error de sintaxis

+0

Este pequeño fragmento de código está destinado a replicar la función 'cambio' de Perl. No parece causarme un error de compilación, y funciona como estaba previsto. $ server = $ args [0] $ args [string] :: join (',', $ args [1 .. ($ args.count-1)]) –

+0

Vaya, el '=' se eliminó de la segunda línea de alguna manera cuando lo pegué en la pregunta. –

+0

¿Puedo usar parámetros con nombre? alguna muestra al respecto? – Kiquenet

Cuestiones relacionadas