PowerShell 技能连载 - 随机排列数字列表
适用于 PowerShell 所有版本
这行代码将输入一个数字列表并对它们随机排序:
1 | Get-Random -InputObject 1, 2, 3, 5, 8, 13 -Count ([int]::MaxValue) |
也可以用管道,不过速度更慢:
1 | 1, 2, 3, 5, 8, 13 | Sort-Object -Property { Get-Random } |
适用于 PowerShell 所有版本
这行代码将输入一个数字列表并对它们随机排序:
1 | Get-Random -InputObject 1, 2, 3, 5, 8, 13 -Count ([int]::MaxValue) |
也可以用管道,不过速度更慢:
1 | 1, 2, 3, 5, 8, 13 | Sort-Object -Property { Get-Random } |
适用于 Windows 8.1 / Server 2012 R2
Windows 8.1 和 Server 2012 R2 带来的许多客户端和服务器 cmdlet 可以极大地简化磁盘的管理。
让我们从查看磁盘和分区开始。这将列出所有加载的磁盘:
1 | PS> Get-Disk |
这将列出分区:
1 | PS> Get-Partition |
这两个 cmdlet 都位于“Storage”模块中:
1 | PS> Get-Command -Name Get-Disk | Select-Object -ExpandProperty Module |
这将列出该模块中的所有存储管理命令:
1 | PS> Get-Command -Module storage |
适用于 PowerShell 所有版本
您有安装 Windows 8.1 Basic 版、Pro 版,或 Enterprise 版吗?查看 Windows 版本号很容易,但查看具体是哪个子系列则不这么容易。
最好的方法是,获取 SKU 号,它能精确地体现 Windows 的版本类型,但如何将数字转化为一个有意义的名字也不太容易:
1 | PS> Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty OperatingSystemSKU |
一个稍好的方式是用这段代码返回您当前使用的许可类型的明确的文字描述:
1 | PS> Get-WmiObject SoftwareLicensingProduct -Filter 'Name like "Windows%" and LicenseStatus=1' | Select-Object -ExpandProperty Name |
另一种方法也可以返回 Windows 的主要版本信息:
1 | PS> Get-WmiObject -Class Win32_OperatingSystem | Select-Object -ExpandProperty Caption |
适用于 PowerShell 所有版本
您可能已经使用 Join-Path
通过父文件夹和文件来创建路径名。这个 cmdlet 在合并路径元素的时候能够正确地处理反斜杠的个数:
1 | $part1 = 'C:\somefolder\' |
然而,如果路径元素存在,Join-Path
将会失败。所以您无法为一个没有加载的驱动器创建路径:
1 | $part1 = 'L:\somefolder\' |
其实,Join-Path
所做的事也可以通过手工很好地完成。这段代码将合并两段路径元素并且能处理好反斜杠:
1 | $part1 = 'L:\somefolder\' |
如果您在 Windows 功能中启用了 Hyper-V 的 PowerShell 模块(如前一个技能中描述的一样的),您现在就可以通过 PowerShell 管理虚拟磁盘。
适用于 Windows 8.1 Pro/Enterprise 或 Server 2012 R2
Windows 8.1 和 Server 2012 R2 带来一系列额外的 cmdlet 命令,有一部分用于管理虚拟磁盘。不过,在使用这些 cmdlet 之前,您需要先启用“Hyper-V 角色”(请注意需要 Windows 8.1 Pro 或 Enterprise 版才支持客户端的 Hyper-V。“Home”版则不支持该功能)。
在 Windows 8.1 中,您需要手动做以下操作:打开控制面板,进入程序/程序和功能。您也可以在 PowerShell 中键入“appwiz.cpl”打开该功能。
下一步,点击“启用或关闭 Windows 功能”。这将打开一个列出所有功能的对话框。请定位到“Hyper-V”节点并启用它。然后点击 OK。如果找不到“Hyper-V”节点,那么您的 Windows 版本不支持客户端的 Hyper-V。如果“Hyper-V 平台”选项呈灰色,那么您需要在计算机的 BIOS 设置中启用虚拟化支持。
安装该功能需要几秒钟。当安装完成以后,您就可以使用一系列新的 cmdlet:
1 | PS> Get-Command -Module Hyper-V |
适用于 PowerShell 所有版本
您可以像其它命令一样在 PowerShell 脚本中使用 ping.exe。向 ping 命令加入“-4
”参数之后,您可以强制 ping 命令使用 IPv4 协议(也可以用“-6
”参数强制使用 IPv6)。
PS> ping localhost -4
适用于 PowerShell ISE 3 及以上版本
当您下载了 PowerShell 帮助文件之后(在提升权限的 shell 中,用 Update-Help
),您就可以用 Get-Help
命令来查找许多有用主题背后的信息。例如,以下代码将列出所有包含关键字“Parameter”的主题:
PS> Get-Help parameter
Name Category Module Synopsis
---- -------- ------ --------
Get-ClusterParameter Cmdlet FailoverClusters Get-Cl...
Set-ClusterParameter Cmdlet FailoverClusters Set-Cl...
about_CommonParameters HelpFile Descri...
about_Functions_Advanced_Param... HelpFile Explai...
about_Parameters HelpFile Descri...
about_Parameters_Default_Values HelpFile Descri...
about_ActivityCommonParameters HelpFile Descri...
about_WorkflowCommonParameters HelpFile
一般性的帮助主题都是以“about_”开头的。
在 PowerShell ISE 中,只需要单击任何一个列出的名称,然后按下 F1
键,就可以在独立的帮主窗口中打开关联的主题。
适用于 PowerShell 所有版本
函数的优先级永远比 cmdlet 高,所以如果两者名字相同,函数将会被执行。
这个函数将切实有效地改变 Get-Process
的行为:
function Get-Process
{
'go away'
}
以下是意料之中的执行结果:
PS> Get-Process
go away
甚至如果您指定了 cmdlet 的完整限定名,函数也可以优先执行:
function Microsoft.PowerShell.Management\Get-Process
{
'go away'
}
执行结果:
PS> Microsoft.PowerShell.Management\Get-Process -Id $pid
go away
这也适用于别名。它们的优先级甚至比函数更高。
唯一能确保确实执行的是 cmdlet 的方法是直接存取模块,选择希望执行的 cmdlet,然后直接调用它:
$module = Get-Module Microsoft.PowerShell.Management
$cmdlet = $module.ExportedCmdlets['Get-Process']
& $cmdlet
或者,只需要用 -noprofile
参数启动一个新的 PowerShell,确保没有人能混进您的 PowerShell 环境即可。
适用于 PowerShell 所有版本
假设您的系统启用了 EFS (Encrypting File System),并且您想将文件保存到一个 NTFS 盘中,那么以下是加密以及确保只有您可以读取该文件的方法:
(Get-Item -Path 'C:\path..to..some..file.txt').Encrypt()
如果加密成功,那么在 explorer.exe 中将会显示为绿色而不是平常的黑色。用 Decrypt()
代替 Encrypt()
来撤销加密。
请注意需要事先设置了 EFS,并且您的公司可能需要一个集中存放的备份加密秘钥。
适用于 PowerShell 控制台
请注意本文所述的内容仅限于“真实的”控制台使用。它不适用于 PowerShell ISE 编辑器。
在 PowerShell 控制台中,许多用户在要分页输出数据时仍然采用管道输出到 more.com
的老办法:
PS> dir c:\windows | more
这看起来能用。不过当您输出大量数据到管道的时候,PowerShell 看起来卡住了:
PS> dir c:\windows -Recurse -ErrorAction SilentlyContinue | more
这是因为 more.com
无法实时工作。它会首先收集所有的输入数据,然后开始分页输出。
更好的办法是使用 Out-Host
cmdlet,结合 -Paging
参数:
PS> dir c:\windows -Recurse -ErrorAction SilentlyContinue | Out-Host -Paging
它能即时输出结果,因为它一旦从管道接收到数据,就可以开始处理。