Powershell Invoke-Command 在手动运行时有效,但在脚本中无效

Powershell Invoke-Command 在手动运行时有效,但在脚本中无效

我正在编写一个脚本来远程安装 PSWindowsUpdate PowerShell 模块,打开正确的防火墙端口,然后运行命令来安装等待更新。为了安装 PSWindowsUpdate 模块,我需要在我的某些机器上安装 MSI 以启用“Install-Module”命令行。

如果我在本地计算机上的管理 PowerShell 会话中手动运行以下代码,它可以正常工作:

$RemoteMachine = "DCSvrRDS16"
write-host "Server Name is: $RemoteMachine"

#Copy the MSI Local to the computer
Write-Host "Copying MSI locally"
Copy "\\dcsvrstorage2\software\microsoft\powershell\PackageManagement_x64.msi" \\$RemoteMachine\c$\

#Run the MSI remotely
Write-Host "Running MSI"
Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { c:\windows\system32\msiexec /i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log } 4>&1

但是,如果我在完全相同的已打开的 PowerShell 会话中运行此完整脚本,则 MSI 不会安装,也不会创建日志文件:

Import-Module PSWindowsUpdate
$domaincredentials = Get-Credential


Function ProcessMachine($RemoteMachine) {

    write-host "Server Name is: $RemoteMachine"

    #Copy the MSI Local to the computer
    Write-Host "Copying MSI locally"
    Copy "\\dcsvrstorage2\software\microsoft\powershell\PackageManagement_x64.msi" \\$RemoteMachine\c$\

    #Run the MSI remotely
    Write-Host "Running MSI"
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { c:\windows\system32\msiexec /i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log } 4>&1

    #Install the module
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Install-Module PSWindowsUpdate -Force }

    #Turn on the firewall rules
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Set-NetFirewallRule -DisplayName "COM+ Network Access (DCOM-In)" -Enabled True }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Set-NetFirewallRule -DisplayName "COM+ Remote Administration (DCOM-In)" -Enabled True }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { Remove-NetFirewallRule -DisplayName "Remote WSUS Install" }
    Invoke-Command -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { New-NetFirewallRule -DisplayName "Remote WSUS Install" -Profile Domain -Enabled True -Direction Inbound -Action Allow -Protocol TCP -LocalPort RPC }

    #Try the update
    Install-WindowsUpdate -ComputerName $RemoteMachine -AcceptAll
}

foreach ($machine in (Get-Content NeedsWSUS.txt)) {

    ProcessMachine $machine

}

这真让我抓狂。我在远程机器上运行了 ProcessMonitor,我可以看到 msiexec 启动然后停止,而从未访问 C: 驱动器根目录中的 MSI 或尝试打开日志文件进行写入。

有人见过类似的东西吗?客户端计算机是 Windows 7 pro、Powershell 4,目标计算机是 Windows 2012 R2 和 PowerShell 4。

提前致谢。

答案1

尝试运行需要一些时间才能执行的脚本块或命令时(尤其是在安装活动中),可能会出现此问题。脚本在脚本块中的命令完成其活动之前返回。使用带有 -wait 参数的 Start-Process 会让脚本等待,直到正在运行的命令完成并返回到脚本。我以前在远程计算机上安装时注意到了这一点,而在本地运行而没有 Start-Process 似乎工作正常。

正如您所注意到的,正确的命令更改是:

调用命令 -ComputerName $RemoteMachine -Credential $domaincredentials -ScriptBlock { 启动进程 msiexec "/i c:\PackageManagement_x64.msi /quiet /lvx* c:\PackageManagement.log" -wait }

相关内容