2011-12-17 13 views
7

Voglio utilizzare Powershell per chiamare un file batch su macchine remote. Questo file batch ha argomenti. Ecco quello che ho finora:Utilizzo di Invoke-Command di Powershell per chiamare un file batch con argomenti

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

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

Dopo un po 'di ricerca, ho trovato che la funzione di Invoke-Command esegue il suo scriptblock in un intero processo di nuovo, quindi non si può mettere le variabili in esso (hanno vinto' t si espande). Ecco a cosa serve il tag -ArgumentList. Così ho provato questo invece ...

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

Che non ha funzionato neanche ... il mio script di gruppo mi dice che non vengono passati argomenti. Non riesco a trovare nulla che lo dica esplicitamente, ma sembra che il parametro -ArgumentList funzioni solo sugli script di PowerShell (non li inoltrerà a uno script batch).

Qualche idea su come utilizzare Invoke-Command per chiamare un file batch con argomenti?

risposta

6

Quando si passa la lista degli argomenti a lo scriptblock, prova a "riceverli" usando una direttiva PARAM. Come questo:

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

oppure si può semplicemente utilizzare il $ args variabile automatica:

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

Grazie, l'ho fatto! Questo è anche quello che dice di fare nella documentazione di Technet per Invoke-Command, quindi mi vergogno un po 'di non riuscire a capirlo da solo! Quel poco di $ args è comunque utile. –

3

Gli argomenti verranno passati come argomenti allo scriptblock e non direttamente al cmd. Quello che dovete fare:

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

o

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

PS: Non so che cosa si sta facendo con $args [string]::join(',',$args[1 .. ($args.count-1)]), si tratta di un errore di sintassi

+0

Questo piccolo frammento di codice è destinato a replicare la funzione 'shift' di Perl. Non sembra causare un errore del compilatore per me e funziona come previsto. $ server = $ args [0] $ args [stringa] :: join (',', $ args [1 .. ($ args.count-1)]) –

+0

Whoops, il '=' è stato eliminato da la seconda riga in qualche modo quando l'ho incollata nella domanda. –

+0

Posso usare i parametri con nome? qualche esempio a riguardo? – Kiquenet

Problemi correlati