我不期待得到答案,但我希望得到一个方向。
有时,PowerShell ISE 似乎表现得很奇怪。奇怪的现象似乎无缘无故出现。我还没有找到重现这种行为的方法。
三天前,我正在编写对 CERT:\ 驱动器进行操作的代码,Intellisense 向我显示了文件系统提供程序(-File
和-Directory
)而不是证书提供程序(-ExpiringInDays
)的参数。
今天,这段代码引发了一个异常。
Invoke-Command -ComputerName OneServer -Credential $admin `
-ScriptBlock {Get-ChildItem -Path CERT:\ -Recurse -ExpiringInDays 366}
系统无法打开指定的设备或文件 + 类别信息:未指定:(:)[Get-ChildItem],Win32Exception + 完全合格的错误标识:System.ComponentModel.Win32Exception,Microsoft.PowerShell.Commands.GetChildItemCommand + PSComputerName:一个服务器
在同一 PowerShell 会话中在本地计算机上运行此代码片段时引发了相同的异常。
Get-ChildItem -Path CERT:\ -Recurse -ExpiringInDays 366
CERT:
、CERT:\
和 也有同样的例外CERT:\*
。
如果我使用 深入一个目录-Path CERT:\LocalMachine
,它运行时不会引发异常,但它返回的证书将在几年后(超过 366 天)过期。
我切换到另一个 PowerShell 会话,粘贴这两个代码片段,并且都运行良好。$admin
两个会话中的变量都设置正确。对我来说,这似乎表明执行环境中出现了问题。但就在上面,Invoke-Command 和本地命令引发了相同的错误。我不明白这一点。
PowerShell 事件日志(在 Microsoft/Windows/PowerShell/Operational 下)没有显示该异常的错误,但它们显示了与 Invoke-Command 相关的“访问被拒绝”错误。
WSMan 报告错误,错误代码:5。 错误消息:连接远程服务器 oneserver 失败,并显示以下错误消息:访问被拒绝。
我认为这与执行环境有关。在不同的 PowerShell 会话中运行相同的代码可以正常工作。
其他可能相关的事情
- 仅当 Windows 强制我关机、注销或重新启动时,我才这样做。
- 我通常会打开多个 PowerShell ISE 窗口。它们可能会打开好几天。在此期间,它们似乎运行良好。(但我真的知道吗?)
- 有时,没有变量的代码会在一个窗口中失败或产生奇怪的输出,但在另一个窗口中会按预期工作。我并不总是注意到输出很奇怪。(PowerShell 告诉我 2020 年之前没有证书会过期。这是对的,还是很奇怪?我并不总是知道。)
- 奇怪的 IntelliSense 行为(上文)。
- 每次打开 ISE,Pester 单元测试都会针对我的所有生产代码运行。偶尔,很多测试都会失败。如果我再次手动运行它们,它们就会成功。打开一个新的 ISE 窗口,它们就会成功。
我该如何隔离此类问题?
PS > $PS版本表 名称值 ---- ----- PS版本 5.1.15063.413 PSEdition 桌面版 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...} 版本号 10.0.15063.413 CLR版本 4.0.30319.42000 WSManStack版本 3.0 PSRemotingProtocol版本 2.3 序列化版本 1.1.0。
远程服务器也类似:自动化作业每天都会针对我们所有的生产服务器运行 Invoke-Command 脚本,不会出现任何错误。很有可能。也许。