Команда Invoke-Expression не выполняется

Я загружаю ранее созданный текстовый файл, в котором просто перечислены номера КБ для всех установленных в настоящее время обновлений Windows. Я пытаюсь извлечь этот файл и вызвать wusa.exe и передать ему номер базы знаний для выполнения удаления.

$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, так это то, что он выводит только части Write-Host одну за другой примерно через 2 секунды. Я не вижу открывающихся командных окон и не вижу, чтобы они действительно что-то делали. Я запускаю сценарий PowerShell «От имени администратора» с неограниченной политикой выполнения. Я также пытался добавить «runas» в $command для вызова окна CMD каждый раз с правами администратора, и это не имело никакого значения. Вызов через Invoke-Command тоже ничего не меняет.


person spickles    schedule 30.10.2014    source источник
comment
Я думаю, вы используете не тот командлет, попробуйте start-processвместо invoke-expression   -  person Loïc MICHEL    schedule 30.10.2014
comment
Я попробую это на своем ноутбуке, где я использую PowerShell v4.0, но целевой компьютер — PowerShell v2.0. Мне, вероятно, придется обновить целевой компьютер, если это заработает. Было бы неплохо узнать, как заставить его работать в версии 2.0.   -  person spickles    schedule 30.10.2014
comment
Ну, вы знаете, что процесс запуска доступен в V2. Если вы хотите сохранить свою логику, я думаю, вы можете написать свой код в пакетном файле и использовать invoke-expression yourbatch.bat   -  person Loïc MICHEL    schedule 30.10.2014
comment
Да, мне пришлось посмотреть, в какой версии «Start-Process» была впервые реализована поддержка. Я изменил скрипт, и сейчас он работает. Итак, «Процесс запуска» был ключом, так что спасибо. А вот что получается после запуска скрипта, это уже другая история...   -  person spickles    schedule 30.10.2014


Ответы (1)


PowerShell может выполнять большинство команд напрямую без особых проблем.

Использование Invoke-Expression только усложняет ситуацию, как и Invoke-Command или Start-Process, потому что вам нужно правильно цитировать и передавать аргументы немного неестественным образом.

Вы даже можете не запускать cmd.exe большую часть времени.

Попробуйте следующее:

wusa.exe /uninstall "/kb:$($kb.Trim().Substring(2))" /quiet /norestart
person Jason Shirk    schedule 30.10.2014