PowerShell的命令一般有两种实现:一种直接定义在.NET的程序集中,另外一种是使用PowerShell脚本实现的。后者可以直接看到其实现,有时候学习系统命令的实现,可能会给我们写脚本也带来灵感。
查看那些命令定义在Dll中
PS> Get-Command | where { $_.DLL -ne $null } CommandType Name ModuleName ----------- ---- ---------- Cmdlet Add-Computer Microsoft.PowerShell.Management Cmdlet Add-Content Microsoft.PowerShell.Management Cmdlet Add-History Microsoft.PowerShell.Core Cmdlet Add-Member Microsoft.PowerShell.Utility Cmdlet Add-PSSnapin Microsoft.PowerShell.Core ……
查看Add-Computer命令的Dll
PS> (Get-Command Add-Computer).DLL I:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\Microsoft.PowerShell.Commands.Management\v4.0_3.0.0.0__31bf3856ad364e35\Micr osoft.PowerShell.Commands.Management.dll
Get-Command返回的对象有一个属性Definition,如果该命令的实现为脚本,则可以查看具体实现。例如我想查看命令Unlock-BitLocker的实现,使用:
(Get-Command Unlock-BitLocker).Definition
输出结果:
[CmdletBinding( SupportsShouldProcess=$true, HelpUri="http://go.microsoft.com/fwlink/?LinkID=264892")] Param( [Parameter(Position = 0, Mandatory = $true, ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true)] [ValidateNotNullOrEmpty()] [string[]] $MountPoint, # # Password Protector # [Parameter(Mandatory = $true, ParameterSetName="OnlyPasswordParameterSet")] [Alias("pw")] [System.Security.SecureString] $Password, # # Recovery Password Protector # [Parameter(Mandatory = $true, ParameterSetName="OnlyRecoveryPasswordParameterSet")] [ValidateNotNullOrEmpty()] [Alias("rp")] [String] $RecoveryPassword, # # Recovery Key Protector # [Parameter(Mandatory = $true, ParameterSetName="OnlyRecoveryKeyParameterSet")] [ValidateNotNullOrEmpty()] [Alias("rk")] [String] $RecoveryKeyPath, # # Ad Account Or Group Protector # [Parameter(Mandatory = $true, ParameterSetName="OnlyAdAccountOrGroupParameterSet")] [System.Management.Automation.SwitchParameter] $AdAccountOrGroup ) process { Write-Debug "Begin Unlock-BitLocker($MountPoint)" ######### # ValidMountPoint is a subset of the elements of MountPoint array. # If MountPoint array contains an element that is not a valid mount point then # the mount point is not part of ValidMountPoint # Only those BitLockerVolume structures are returned that are part of ValidMountPoint # # If "-whatif" is used then ValidMountPoint is always $null ######### [string[]]$ValidMountPoint = $null for($i=0; $i -lt $MountPoint.Count; $i++) { $BitLockerVolumeInternal = Get-BitLockerVolumeInternal -MountPoint $MountPoint[$i] if (!$BitLockerVolumeInternal) { $m = $MountPoint[$i] Write-Debug "The following operation failed: Get-BitLockerVolumeInternal -MountPoint $m" continue } Write-Debug ("MountPoint: " + $BitLockerVolumeInternal.MountPoint) if ($pscmdlet.ShouldProcess($BitLockerVolumeInternal.MountPoint)) { if ($PsCmdlet.ParameterSetName -eq "OnlyPasswordParameterSet") { $Result = Unlock-PasswordInternal $BitLockerVolumeInternal.MountPoint $Password } elseif ($PsCmdlet.ParameterSetName -eq "OnlyRecoveryPasswordParameterSet") { $Result = Unlock-RecoveryPasswordInternal $BitLockerVolumeInternal.MountPoint $RecoveryPassword } elseif ($PsCmdlet.ParameterSetName -eq "OnlyRecoveryKeyParameterSet") { $Result = Unlock-RecoveryKeyInternal $BitLockerVolumeInternal.MountPoint $RecoveryKeyPath } elseif ($PsCmdlet.ParameterSetName -eq "OnlyAdAccountOrGroupParameterSet") { $Result = Unlock-AdAccountOrGroupInternal $BitLockerVolumeInternal.MountPoint } if ($Result -ne 0) { Write-Debug "Unlock-BitLocker failed for $BitLockerVolumeInternal.MountPoint" continue } $ValidMountPoint = $ValidMountPoint + $MountPoint[$i] } } Write-Debug "ValidMountPoint: $ValidMountPoint" if ($ValidMountPoint) { $BitLockerVolume = Get-BitLockerVolume -MountPoint $ValidMountPoint $BitLockerVolume } else { Write-Debug "No valid mount point was provided that can be unlocked" } Write-Debug "End Unlock-BitLocker. Return $BitLockerVolume" }
本文链接: https://www.pstips.net/view-definition-of-cmdlets.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!