2014-10-30 41 views
0

我正在拉一個以前創建的文本文件,該文件只是列出所有當前安裝的Windows更新的KB編號。我正在嘗試將此文件放入並呼叫wusa.exe並將其傳遞給KB號碼以執行卸載。調用表達式不運行命令

$a = Get-Content c:\hotfixid.txt 
foreach ($kb in $a) { 
    $command = 'cmd /c wusa.exe /uninstall /kb:' + $kb.Trim().Substring(2) + ' /quiet /norestart' 
    #Write-Host $command 
    Write-Host "Currently uninstalling $kb" 
    Invoke-Expression -Command:$command 
} 

如果我使用

Write-Host $command 

,並複製到直接在Windows中運行對話框中,它成功完成。

當我在PowerShell腳本中運行它時會發生什麼,它僅在大約2秒內一個接一個地輸出Write-Host部分。我沒有看到任何命令窗口打開,我沒有看到它實際上做任何事情。我使用不受限制的執行策略運行PowerShell腳本'作爲管理員'。我也曾嘗試在$command中添加'runas'以每次使用管理權限調用CMD窗口,但沒有任何區別。通過Invoke-Command調用它也沒有區別。

+0

我想你使用了錯誤的cmdlet的,試着用的'啓動process'instead'調用,expression' – 2014-10-30 15:16:01

+0

我想試試我的筆記本電腦,我運行PowerShell v4.0,但目標計算機是PowerShell v2.0。如果結果正常,我可能必須升級目標計算機。雖然知道如何讓它在v2.0中工作,但會很高興。 – spickles 2014-10-30 17:26:13

+0

你知道V2中有啓動進程嗎?如果你想保持你的邏輯,我認爲你可以在批處理文件中編寫你的代碼,並使用'invoke-expression yourbatch.bat' – 2014-10-30 17:52:43

回答

2

PowerShell可以直接運行大多數命令而無需太多麻煩。

Invoke-CommandStart-Process一樣,使用Invoke-Expression會使事情複雜化,因爲您需要獲取引用權限,並以不自然的方式傳遞參數。

大部分時間你甚至可以跳過運行cmd.exe

嘗試以下操作:

wusa.exe /uninstall "/kb:$($kb.Trim().Substring(2))" /quiet /norestart