Windows 带启动进程的PowerShell Invoke命令输出不同的结果

Windows 带启动进程的PowerShell Invoke命令输出不同的结果,windows,powershell,invoke-command,Windows,Powershell,Invoke Command,我有一个用于运行Dell命令更新工具的更新脚本。简而言之,dcu cli.exe。现在的情况是,当我在本地计算机上运行相同的脚本代码时,一切都正常运行,但当我在带有调用命令的脚本中运行完全相同的代码时(是的,我拥有完全的管理权限),exitcode是2意味着发生了未知的应用程序错误,而不是0(一切正常) 这是一个非常大的脚本,所以我创建了一个新脚本来调试它。这是短路代码: Invoke-Command -ComputerName "MyComputer" -ScriptBlo

我有一个用于运行Dell命令更新工具的更新脚本。简而言之,
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?否,路径的其余部分仍然存在。