gpt4 book ai didi

通过远程运行空间运行时 PowerShell RemoteException 不一致

转载 作者:行者123 更新时间:2023-12-02 00:51:34 25 4
gpt4 key购买 nike

我有这个演示脚本,我将其放入 Jenkins 作业中:

Write-Host "##############################################"
$ErrorActionPreference = "Stop"

Write-Host "ErrorActionPreference: $ErrorActionPreference"
Write-Host "whoami: $(whoami)"
$PSVersionTable | Format-Table

try {
cmd /c "comanddoesnotexist c:/foo c:/bar"
} catch {
Write-Host "### Exception! ###"
}

Write-Host "################### TRACE ###########################"

Trace-Command -Name errorrecord -Expression { cmd /c "comanddoesnotexist c:/foo c:/bar" } -PSHost

Write-Host "##############################################"

当我在本地运行它时,我得到以下结果:

##############################################
ErrorActionPreference: Stop
whoami: td\builder

Name Value
---- -----
PSVersion 5.1.17763.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1


Der Befehl "comanddoesnotexist" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
################### TRACE ###########################
Der Befehl "comanddoesnotexist" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
##############################################

但是,当我通过 Jenkins 运行完全相同的东西时,我确实得到了以下信息:

[PowerShell_DummyChecks] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\BUILDE~1\AppData\Local\Temp\jenkins5194440861464562005.ps1'"
##############################################
ErrorActionPreference: Stop
whoami: td\builder

Name Value
---- -----
PSVersion 5.1.17763.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1


### Exception! ###
################### TRACE ###########################
cmd : Der Befehl "comanddoesnotexist" ist entweder falsch geschrieben oder
In C:\Users\builder\AppData\Local\Temp\jenkins5194440861464562005.ps1:16 Zeichen:48
+ ... cord -Expression { cmd /c "comanddoesnotexist c:/foo c:/bar" } -PSH ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Der Befehl "com...eschrieben oder:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

Build step 'Windows PowerShell' marked build as failure
Finished: FAILURE

这个“RemoteException”从何而来 - 为什么会被捕获?请注意,Jenkins 服务正在使用与在本地运行时相同的帐户执行。

更糟糕的是,这个问题似乎只存在于上述 Win10 + PowerShell 组合中,当我在另一台(较旧的)服务器上运行相同的作业时,我得到以下(预期的)结果:

[PowerShell_DummyChecks] $ powershell.exe -NonInteractive -ExecutionPolicy ByPass "& 'C:\Users\BUILDE~1\AppData\Local\Temp\jenkins5640455886657276493.ps1'"
##############################################
ErrorActionPreference: Stop
whoami: td\builder

Name Value
---- -----
PSVersion 5.1.14393.3053
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.14393.3053
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1


Der Befehl "comanddoesnotexist" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
################### TRACE ###########################
Der Befehl "comanddoesnotexist" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
##############################################
Build step 'Windows PowerShell' marked build as failure
Finished: FAILURE

现在,再添加一层疯狂:

when I run this script remotely via Enter-PSSession, it always fails with the "weird" behavior as on the new server. (also on the old hosts)

有人知道这里发生了什么吗?

最佳答案

注意:所有这些仅在 Windows PowerShell 5.1 上经过测试/验证

当 PowerShell 在没有附加控制台的情况下运行时,STDERR 会生成“RemoteException”。 (在 PS 远程 session 中也是如此)。当 powershell“看到”一个控制台(即 CREATE_NEW_CONSOLE 或没有特定标志)时,它 will not generate any exception or error , 相反它会只需将来自子进程的 STDERR 输出通过管道传输到它自己的 STDERR 流。此 STDERR 输出将依次显示在控制台窗口中,而不会任何红色高亮或 PS 异常。

从使用“CREATE_NO_WINDOW”或“DETACHED_PROCESS”标志调用的进程运行时,您似乎遇到了麻烦。

在 Windows 10 1809 中:在没有控制台的情况下运行 powershell.exe 时,只需 like Jenkins does it (Java Runtime.exec),它就像在远程 session 中运行一样 (Enter-PSSession)(参见 #3996)。

在 Windows 10 16071903 中:在 STDERR 处理方面,没有控制台的本地启动的 powershell.exe 就好像它有一个控制台(就像从 cmd.exe 运行一样)。(没有异常生成,而是子进程在 STDERR 上的所有输出都通过 powershell.exe 的 STDERR 传递)

旁注:显式使用 Enter-PSSession 时,PoSh 在 1607、1809 和 1903 上的行为相同。

一个可行的解决方案是通过使用“CREATE_NEW_CONSOLE”标志执行 CreateProcess 的应用程序包装所有 powershell.exe 调用,并将 stdout 以及 stderr 重定向到它的父流。MSDN example可以很容易地修改为这样的“代理应用程序”。

关于通过远程运行空间运行时 PowerShell RemoteException 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57166858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com