2011-01-27 14 views

risposta

7

Il blocco di script che viene eseguito tramite Invoke-Command non ha accesso allo stato attuale ambiente, esso viene eseguito in un processo separato. Se stavi eseguendo il comando sul tuo computer locale, avrebbe funzionato.

Il problema è che la stringa "select volume $volumeNum" non viene valutata finché non viene eseguita sul computer remoto. Quindi sta cercando il valore nell'ambiente del processo corrente sulla macchina remota e $volumeNum non è definito lì.

PowerShell fornisce un meccanismo per il passaggio degli argomenti tramite Invoke-Command. Questo funziona dalla mia macchina locale ad un telecomando:

Invoke-Command -ComputerName $ip -ScriptBlock { param($x) "hello $x" } -ArgumentList "world" 

Credo che un approccio simile potrebbe funzionare per voi:

Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {param($volumeNum) "select volume $volumeNum" | diskpart} -ArgumentList $volumeNum 
3

blocchi di script vengono compilati. Ciò significa che i riferimenti variabili in essi sono fissati al momento della compilazione. È possibile aggirare il rinviando creazione del blocco di script fino fase di esecuzione:

$sb = [scriptblock]::create("select volume $volumeNum | diskpart") 
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock $sb 
2

Ulteriore nota per gli altri comming lungo: GetNewClosure non funziona pure.

$filt = "*c*" 
$cl = { gci D:\testdir $filt }.GetNewClosure() 
& $cl 

# returns 9 items 
Invoke-command -computer mylocalhost -script $cl 
# returns 9 items 
Invoke-command -computer mylocalhost -script { gci D:\prgs\tools\Console2 $filt } 
# returns 4 items 
Invoke-command -computer mylocalhost -script { gci D:\prgs\tools\Console2 "*c*" } 
Problemi correlati