'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”如何返回不是命令的“命令”?