'Get-Command' 返回 powershell 会话中所有可用命令的列表。
当传递一个不是命令的字符串时,以下代码的计算结果为 $false:
function f($x) {[bool](Get-Command $x -ErrorAction SilentlyContinue)}
它确实:
PS C:\Windows\system32> f ls
True
PS C:\Windows\system32> f alkdsjfasd
False
所以你会认为下面的代码会返回不是命令的命令列表——这是一个空列表:
Get-Command | Where-Object {[bool](Get-Command $_ -ErrorAction SilentlyContinue) -eq $false}
除非它没有。它在干净的 Windows Server 2016 VM 上返回以下内容:
CommandType Name Version Source
----------- ---- ------- ------
Function Get-IseSnippet 1.0.0.0 ISE
Function Import-IseSnippet 1.0.0.0 ISE
Function New-IseSnippet 1.0.0.0 ISE
Function Start-AutologgerConfig 1.0.0.0 EventTracingManagement
Cmdlet Add-ClusteriSCSITargetServerRole 2.0.0.0 IscsiTarget
如果我稍等片刻并再次运行相同的命令,它会返回一个更长的列表:
CommandType Name Version Source
----------- ---- ------- ------
Function Add-RDServer 2.0.0.0 RemoteDesktop
Function Add-RDSessionHost 2.0.0.0 RemoteDesktop
Function Add-RDVirtualDesktopToCollection 2.0.0.0 RemoteDesktop
Function Disable-RDVirtualDesktopADMachineAccountReuse 2.0.0.0 RemoteDesktop
Function Get-IseSnippet 1.0.0.0 ISE
...
Function Test-RDVirtualDesktopADMachineAccountReuse 2.0.0.0 RemoteDesktop
Function Update-RDVirtualDesktopCollection 2.0.0.0 RemoteDesktop
例如,我检查了 RemoteDesktop 模块中的文件,并且能够找到“缺失”的功能。
这里发生了什么?'Get-Command' 如何返回不是命令的“命令”?