PowerShell Invoke-Command with Start-Process 输出不同的结果
PowerShell Invoke-Command with Start-Process outputs different result
我有一个用于 运行Dell Command 更新工具的更新脚本。总之dcu-cli.exe
。现在的事情是,当我 运行 在本地计算机上使用相同的脚本代码时,一切 运行 都可以,但是当我 运行 与 invoke-command
的脚本中的代码完全相同时(是的,我拥有完全的管理员权限)比退出代码 2
意思是 An unknown application error has occurred
而不是 0 (everything OK)
这是一个非常大的脚本,所以我创建了一个新脚本来调试它。这是短代码:
Invoke-Command -ComputerName "MyComputer" -ScriptBlock {
$ExitCode = 0
#Declare path and arguments
$DcuCliPath = 'C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe'
$DellCommand = "/applyUpdates -autoSuspendBitLocker=enable -outputLog=C:\Dell_Update.log"
#Verify Dell Command | Update exists
If (Test-Path -Path $DcuCliPath) {
$objWMI = Get-WmiObject Win32_ComputerSystem
Write-Host ("Dell Model [{0}]" -f $objWMI.Model.Trim())
$serviceName = "DellClientManagementService"
Write-Host ("Service [{0}] is currently [{1}]" -f $serviceName, (Get-Service $serviceName).Status)
If ((Get-Service $serviceName).Status -eq 'Stopped') {
Start-Service $serviceName
Write-Host "Service [$serviceName] started"
}
#Update the system with the latest drivers
Write-Host "Starting Dell Command | Update tool with arguments [$DellCommand] dcu-cli found at [$DcuCliPath]"
$ExitCode = (Start-Process -FilePath ($DcuCliPath) -ArgumentList ($DellCommand) -PassThru -Wait).ExitCode
Write-Host ("Dell Command | Update tool finished with ExitCode: [$ExitCode] current Win32 ExitCode: [$LastExitCode] Check log for more information: C:\Dell_Update.log")
}
}
当我删除 Invoke-Command -ComputerName "MyComputer" -ScriptBlock {
然后复制 + 运行 PC 上的本地脚本时,退出代码 = 0
我还注意到,当我通过 'Invoke-Command' 运行 命令时,我在参数中传递时也没有创建日志文件...所以我最好的猜测是本地和远程路径出错了吗?
所以我错过了什么?我猜这很简单,但我花了几个小时才得到这个 运行ning 没有任何运气......
尝试运行这种方式。您应该能够看到任何输出或错误消息。我通常先添加到路径而不是使用 &
或 start-process
.
invoke-command mycomputer {
$env:path += ';C:\Program Files (x86)\Dell\CommandUpdate';
dcu-cli /applyUpdates -autoSuspendBitLocker=enable -outputLog=C:\Dell_Update.log }
在 invoke-command 中使用 start-process 似乎很有挑战性。除非我将它保存到文件中,否则我什至看不到 findstr 的输出。如果我不等待,输出将被截断。默认情况下,启动进程在后台和另一个 window 中运行。还有一个 -nonewwindow
选项,但它对 invoke-command 没有帮助。
invoke-command localhost { # elevated
start-process 'findstr' '/i word c:\users\joe\file1' -wait -RedirectStandardOutput c:\users\joe\out }
@js2010,感谢您的额外帮助。不幸的是,这也没有帮助。
所以我又做了一些调试,结果发现这是我测试机器上的 dcu-cli 版本 运行 中的一个错误,DOH...!!
在测试机器上版本 3.1.1 是 运行,在另一台机器上版本 4.0 是 运行,并且通过远程 Powershell 运行良好。所以我查找了发行说明,我在这里找到了它:https://www.dell.com/support/kbdoc/000177325/dell-command-update
正如您在版本 3.1.3 中看到的那样,有此修复:
A problem was solved where dcu-cli.exe was not executed in an external interactive session of PowerShell.
我有一个用于 运行Dell Command 更新工具的更新脚本。总之dcu-cli.exe
。现在的事情是,当我 运行 在本地计算机上使用相同的脚本代码时,一切 运行 都可以,但是当我 运行 与 invoke-command
的脚本中的代码完全相同时(是的,我拥有完全的管理员权限)比退出代码 2
意思是 An unknown application error has occurred
而不是 0 (everything OK)
这是一个非常大的脚本,所以我创建了一个新脚本来调试它。这是短代码:
Invoke-Command -ComputerName "MyComputer" -ScriptBlock {
$ExitCode = 0
#Declare path and arguments
$DcuCliPath = 'C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe'
$DellCommand = "/applyUpdates -autoSuspendBitLocker=enable -outputLog=C:\Dell_Update.log"
#Verify Dell Command | Update exists
If (Test-Path -Path $DcuCliPath) {
$objWMI = Get-WmiObject Win32_ComputerSystem
Write-Host ("Dell Model [{0}]" -f $objWMI.Model.Trim())
$serviceName = "DellClientManagementService"
Write-Host ("Service [{0}] is currently [{1}]" -f $serviceName, (Get-Service $serviceName).Status)
If ((Get-Service $serviceName).Status -eq 'Stopped') {
Start-Service $serviceName
Write-Host "Service [$serviceName] started"
}
#Update the system with the latest drivers
Write-Host "Starting Dell Command | Update tool with arguments [$DellCommand] dcu-cli found at [$DcuCliPath]"
$ExitCode = (Start-Process -FilePath ($DcuCliPath) -ArgumentList ($DellCommand) -PassThru -Wait).ExitCode
Write-Host ("Dell Command | Update tool finished with ExitCode: [$ExitCode] current Win32 ExitCode: [$LastExitCode] Check log for more information: C:\Dell_Update.log")
}
}
当我删除 Invoke-Command -ComputerName "MyComputer" -ScriptBlock {
然后复制 + 运行 PC 上的本地脚本时,退出代码 = 0
我还注意到,当我通过 'Invoke-Command' 运行 命令时,我在参数中传递时也没有创建日志文件...所以我最好的猜测是本地和远程路径出错了吗?
所以我错过了什么?我猜这很简单,但我花了几个小时才得到这个 运行ning 没有任何运气......
尝试运行这种方式。您应该能够看到任何输出或错误消息。我通常先添加到路径而不是使用 &
或 start-process
.
invoke-command mycomputer {
$env:path += ';C:\Program Files (x86)\Dell\CommandUpdate';
dcu-cli /applyUpdates -autoSuspendBitLocker=enable -outputLog=C:\Dell_Update.log }
在 invoke-command 中使用 start-process 似乎很有挑战性。除非我将它保存到文件中,否则我什至看不到 findstr 的输出。如果我不等待,输出将被截断。默认情况下,启动进程在后台和另一个 window 中运行。还有一个 -nonewwindow
选项,但它对 invoke-command 没有帮助。
invoke-command localhost { # elevated
start-process 'findstr' '/i word c:\users\joe\file1' -wait -RedirectStandardOutput c:\users\joe\out }
@js2010,感谢您的额外帮助。不幸的是,这也没有帮助。
所以我又做了一些调试,结果发现这是我测试机器上的 dcu-cli 版本 运行 中的一个错误,DOH...!!
在测试机器上版本 3.1.1 是 运行,在另一台机器上版本 4.0 是 运行,并且通过远程 Powershell 运行良好。所以我查找了发行说明,我在这里找到了它:https://www.dell.com/support/kbdoc/000177325/dell-command-update
正如您在版本 3.1.3 中看到的那样,有此修复:
A problem was solved where dcu-cli.exe was not executed in an external interactive session of PowerShell.