Windows 带启动进程的PowerShell Invoke命令输出不同的结果
我有一个用于运行Dell命令更新工具的更新脚本。简而言之,Windows 带启动进程的PowerShell Invoke命令输出不同的结果,windows,powershell,invoke-command,Windows,Powershell,Invoke Command,我有一个用于运行Dell命令更新工具的更新脚本。简而言之,dcu cli.exe。现在的情况是,当我在本地计算机上运行相同的脚本代码时,一切都正常运行,但当我在带有调用命令的脚本中运行完全相同的代码时(是的,我拥有完全的管理权限),exitcode是2意味着发生了未知的应用程序错误,而不是0(一切正常) 这是一个非常大的脚本,所以我创建了一个新脚本来调试它。这是短路代码: Invoke-Command -ComputerName "MyComputer" -ScriptBlo
dcu cli.exe
。现在的情况是,当我在本地计算机上运行相同的脚本代码时,一切都正常运行,但当我在带有调用命令的脚本中运行完全相同的代码时(是的,我拥有完全的管理权限),exitcode是2
意味着发生了未知的应用程序错误,而不是0(一切正常)
这是一个非常大的脚本,所以我创建了一个新脚本来调试它。这是短路代码:
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命令-ComputerName“MyComputer”-ScriptBlock{
并在PC上复制并运行本地脚本时,exitcode=0
我还注意到,当我通过“Invoke command”运行命令时,在传递参数时也没有创建日志文件……所以我最好的猜测是本地和远程路径出了问题
那么,我遗漏了什么呢?我猜这很简单,但我花了几个小时来运行它,没有任何运气…尝试以这种方式运行它。您应该能够看到任何输出或错误消息。我通常先添加到路径,而不是使用&
或启动进程
invoke-command mycomputer {
$env:path += ';C:\Program Files (x86)\Dell\CommandUpdate';
dcu-cli /applyUpdates -autoSuspendBitLocker=enable -outputLog=C:\Dell_Update.log }
在invoke命令中使用start process似乎很有挑战性。我甚至无法看到findstr的输出,除非我将其保存到文件中。如果我不等待,输出将被截断。默认情况下,start process在后台和另一个窗口中运行。还有一个-nonewindow
选项,但它对invoke命令没有帮助。
invoke-command localhost { # elevated
start-process 'findstr' '/i word c:\users\joe\file1' -wait -RedirectStandardOutput c:\users\joe\out }
@js2010,谢谢你的额外帮助。不幸的是,这也没有帮助
所以我做了更多的调试,结果证明这是在我的测试机器上运行的dcu cli版本中的一个bug,DOH
在测试机器版本3.1.1上运行,在另一台机器版本4.0上运行,通过远程Powershell运行良好。因此,我查找了发行说明,我在此处找到:
正如您在3.1.3版中所看到的,存在以下修复:
A problem was solved where dcu-cli.exe was not executed in an external interactive session of PowerShell.
除了工具路径是程序文件和我放在c:\temp中的日志之外,我使用了您的确切代码。它工作得非常好。它甚至更新了网络驱动程序,丢失了连接,恢复了连接,并且仍然使用exitcode 0退出。来自dcu cli的错误消息是什么?使用启动过程会使它更加困难。它还将尝试弹出一个新的window、 感谢您的测试。令人沮丧的是,它适合您。;-)我也将其调整为C:\Temp,但没有区别。您正在运行哪个版本的dcu cli*(x64部分除外)@js2010我收到的错误消息是ExitCode 2,这意味着有一个应用程序错误。我指的是文本中的错误消息。我会尝试在不启动进程的情况下运行它。否则,您将看不到输出。然后它会打开dcu客户端的一个新窗口并快速关闭。但是,我尝试在另一台PC上运行相同的脚本,并且似乎运行良好…W我将在明天对此进行更多调试。这是完整的错误列表,感谢您的调用提示。通过这种方式,您确实可以从dcu cli工具获得反馈,这非常有帮助。我还注意到,exitcode现在也位于$LastExitCode中。这只是一个简单的问题。当这是大型脚本的一部分时,您是否必须将$env:路径还原为默认路径完成后,脚本中的其他命令将执行OK?否,路径的其余部分仍然存在。