您在使用 PowerShell 时可能会遇到一个奇怪的格式问题:当您一行一行执行代码时,得到的输出结果和以整体的方式执行一段代码有所不同。
这是要执行的示例代码:
Get-Process -Id $pid
Get-Date
Get-Service -Name Spooler
当您将三行代码作为脚本整体运行时,只有第一个命令返回表格,后两个显示列表。但是,当您逐行执行代码时,它们的格式不同,并显示为表格,甚至是单行纯文本。
这是 PowerShell 实时输出格式的副作用:当输出格式化器遇到第一个返回数据时,它必须决定格式化和写入,即表头。所有剩余的数据将插入到该输出格式中。
每当您的脚本返回多个对象并且这些对象具有不同类型时,PowerShell 就会意识到这些对象不适合现有表设计。在这种情况下,所有后续对象将格式化成列表视图。
如果您想更好地控制此行为,则可以随时将输出发送到 Out-Default
,这将关闭当前的输出。任何后续对象都将启动新的输出格式。以下代码将始终显示相同的显示格式,无论您是作为脚本运行还是单独运行命令:
1 | Get-Process -Id $pid | Out-Default |
The Get-ComputerInfo
cmdlet 可以提供有关 Windows 客户端或服务器的大量信息,例如正常运行时间和其他相关信息。
试试以下代码:
1 | PS> Get-ComputerInfo | Select-Object -Property *Upt* |
该命令获取所有名字中包含 “upt” 的属性,这些属性恰好都包含了和系统运行时间有关的信息。
当然,您还可以将信息存储到变量中,并单独查询属性:
1 | PS> $info = Get-ComputerInfo | Select-Object -Property *Upt* |
由于属性值显示在一列中,它们显示为一行字符串。如果您单独查询它们,例如 OsUptime
,它们将暴露它们的所有自身属性。
PowerShell 配备了一个名为 Get-PfxCertificate
的 cmdlet,您可以用来将证书和私钥加载到内存中。但是如果证书受密码保护,则有一个强制性提示来输入密码。您不能通过参数提交密码,因此该 cmdlet 不能无人值守使用。
这是一个替代的函数,允许通过参数输入密码,从而允许以无人值守的方式即时加载 pfx 证书:
1 | function Get-PfxCertificateUnattended |
请注意,该功能始终返回 pfx 文件中发现的第一个证书 如果您的PFX文件包含多个证书,则可能需要在最后一行代码中调整索引。
PowerShell 配备了一个名为 New-SelfSignedCertificate
的 cmdlet,可以创建各种自签名的测试证书。但是,使用它为 PowerShell 代码签名创建证书并不直观,更不用说在测试机上确保测试证书值得信任。
所以我们编写了一个函数将上述 cmdlet 包装起来,使得创建既持久且可导出的代码签名证书变得更加容易:
1 | function New-CodeSigningCert |
在 Windows 10 及以上版本,您可以使用 Get-Volume
获取有关驱动器的卷 ID 和其他信息:
1 | PS> Get-Volume |
这是一个示例:
1 | PS> Get-Volume | Select-Object -Property DriveLetter, FileSystemLabel, Size, Path |
您可以查询 WMI 以获取类似驱动器卷 ID 的列表:
1 | Get-CimInstance -ClassName Win32_Volume | |
永远不要将纯文本输入框用于保密信息和密码——用户输入的文本可能被记录和利用。请始终使用遮罩输入框。这是使用参数的一种简单方法:
1 | param |
只需将数据类型 [SecureString]
用于您的参数,这样将将其强制添加一个带遮罩的输入框。
永远不要将纯文本输入框用于保密信息和密码——用户输入的文本可能被记录和利用。请始终使用遮罩输入框。这是用户提示的一种简单方法:
1 | # asking secret using masked input box |
在 Windows 10 及以上版本,查找 MSI 软件包及其产品代码不再需要 WMI 查询。相反,您可以使用 Get-Package
来替代:
1 | Get-Package | |