2011-01-27 12 views
5

दूसरे उदाहरण के बराबर उदाहरण क्यों नहीं है?दूरस्थ कंप्यूटर पर Invoke-Command का उपयोग करते समय स्ट्रिंग विस्तार PowerShell में काम नहीं करता

1:

$volumeNum = 2 
Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {"select volume $volumeNum" | diskpart} 

2:

Invoke-Command -ComputerName $IP -Credential $GuestVM -ScriptBlock {"select volume 2" | diskpart} 

क्यों शामिल नहीं है powershell का मूल्यांकन

"का चयन मात्रा $ volumeNum"

करने के लिए

चयन मात्रा 2

उत्तर

7

स्क्रिप्ट ब्लॉक Invoke-Command के माध्यम से क्रियान्वित किया जाता है कि मौजूदा माहौल राज्य के लिए पहुँच नहीं है, यह एक अलग प्रक्रिया में चलाया जाता है। यदि आप अपने स्थानीय कंप्यूटर पर कमांड चला रहे थे तो यह काम करेगा।

समस्या यह है कि स्ट्रिंग "select volume $volumeNum" को तब तक मूल्यांकन नहीं किया जा रहा है जब तक कि यह दूरस्थ मशीन पर निष्पादित न हो जाए। तो यह रिमोट मशीन पर वर्तमान प्रक्रिया के माहौल में मूल्य की तलाश कर रहा है और $volumeNum को परिभाषित नहीं किया गया है।

पावरशेल Invoke-Command के माध्यम से तर्क पारित करने के लिए एक तंत्र प्रदान करता है। यह एक दूरस्थ करने के लिए अपने स्थानीय मशीन से काम करता है:

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

मेरा मानना ​​है कि एक समान दृष्टिकोण आप के लिए काम करेंगे:

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

स्क्रिप्ट ब्लॉक संकलित कर रहे हैं। इसका मतलब है कि उनमें परिवर्तनीय संदर्भ संकलित समय पर तय किए गए हैं। साथ आ रही दूसरों के लिए

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

इसके अलावा ध्यान दें:: आप रन समय तक स्क्रिप्ट ब्लॉक के निर्माण के टाल इस पर काम कर सकते हैं GetNewClosure रूप में अच्छी तरह से काम नहीं करता।

$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*" } 
संबंधित मुद्दे

 संबंधित मुद्दे