2012-05-16 42 views
2

稱呼!PowerShell代碼以交互方式工作,但不在腳本中

所以,我只是在我每天的一些PowerShell的編程程序,我得到了這個小傢伙:

Get-WmiObject : Invalid class 
At line:184 char:19 
+ $RECApp = gwmi <<<< Win32_product | ? {$_.Name.Contains($Application)} 
+ CategoryInfo   : InvalidOperation: (:) [Get-WmiObject], ManagementException 
+ FullyQualifiedErrorId: GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand 

有趣的是,當代碼是從一個腳本執行時,才顯示此錯誤,但是當手動輸入到命令行中時,相同的代碼將起作用。我不知道這是否與我正在執行腳本的遠程機器有關,但爲什麼它應該如果它在手動輸入時起作用,而不是在從腳本執行時起作用。我給你拿一塊這裏我的代碼:

Enter-PSSession -ComputerName $serverName 
$App = gwmi Win32_product | ? {$_.Name.Contains($Application)} 
$App.Uninstall(); 
exit 

總之,爲什麼像一個魅力此代碼的工作手動輸入命令行的時候,但是當執行表單的腳本,我得到上述錯誤?

謝謝。

回答

4

Enter-PSSession僅供交互使用。如果您將該行放入腳本中,則後續行會在遠程會話中運行而不是。如果要遠程執行一些腳本,腳本中,你會做這樣的事情,而不是:

$session = New-PSSession -ComputerName $serverName 
Invoke-Command -Session $session { 
    param($name) 

    $App = gwmi Win32_product | ? {$_.Name.Contains($name)} 
    $App.Uninstall(); 
} -arguments $application 

有一個有點疑難雜症的存在,因爲我要通過$application作爲參數傳遞給Invoke-Command因爲該變量不在遠程會話中不存在。退一步一點,你可以寫上簡單的有點像這樣:現在

$app = gwmi -computer $servername win32_product | ? { 
     $_.name.contains($application) 
} 

,這個問題是你拉的所有win32_product對象從服務器和過濾回本地機器上。這是很多不必要的網絡流量。這將是,如果你可以在遠程機器上的過濾速度更快,讓我們修改它多一點:

$app = gwmi -computer $servername -query ` 
    "select * from win32_product where name = '$application'" 
$app.Uninstall() 

現在只有win32_product你想會從遠程計算機檢索。我還沒有測試過上述gwmi -computer變體,所以它更多地說明了技術和語法。你可能需要玩一下。

+0

唔,當別人用這樣一個很好的解釋來回答你的問題時,你就不喜歡它。非常感謝:) P.S.此後是否需要終止會話? –

+1

Aaah我得到這個:使用'Get-PSSession'查找活動會話使用'Remove-PSSession'移除它們。所以,管它來終止它們所有的'Get-PSSession |刪除 - PSSession' –

相關問題