'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 он возвращает следующее:
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 может возвращать «команды», которые не являются командами?