0

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

4

0 回答 0