PowerShell 通过不同的流输出信息。警告写入到与输出不同的流中,而错误也写入不同的流。每个流都有一个唯一的数字标识符:
| ID | Stream |
| 1 | Output |
| 2 | Error |
| 3 | Warning |
| 4 | Verbose |
| 5 | Debug |
| 6 | Information |
如果要丢弃某个流,可以使用重定向运算符(“>”)并将流重定向到 $null。此行代码将丢弃任何错误或警告消息:
1 | Get-Process -FileVersionInfo 2>$null 3>$null |
PowerShell 通过不同的流输出信息。警告写入到与输出不同的流中,而错误也写入不同的流。每个流都有一个唯一的数字标识符:
| ID | Stream |
| 1 | Output |
| 2 | Error |
| 3 | Warning |
| 4 | Verbose |
| 5 | Debug |
| 6 | Information |
如果要丢弃某个流,可以使用重定向运算符(“>”)并将流重定向到 $null。此行代码将丢弃任何错误或警告消息:
1 | Get-Process -FileVersionInfo 2>$null 3>$null |
无论您做什么,PowerShell中都有(少量)命令可将信息输出到控制台。无论流重定向或赋值给 $null 都不能禁止这类命令输出,例如:
1 | PS> $null = Get-WindowsUpdateLog *>&1 |
即使所有输出流都被丢弃,Get-WindowsUpdateLog cmdlet 仍会将大量信息写入控制台。
如果遇到这种情况,最后的方法是暂时禁用内部命令 Out-Default,如下所示:
1 | # temporarily overwrite Out-Default |
当您查询操作系统详细信息时,WMI 会返回一个数字:
1 | PS> Get-CimInstance -ClassName Win32_OperatingSystem | |
SuiteMask 实际上是一个位掩码,其中每个位代表一个特定的细节。要将其转换为可读的文本,请使用标志枚举:
1 | $SuiteMask = @{ |
这将添加一个计算得出的 SuiteMaskText 属性,该属性列出了已安装的操作系统扩展:
Caption SuiteMask SuiteMaskText
------- --------- -------------
Microsoft Windows 10 Pro 272 TerminalServices, TerminalServicesSingleSession
PowerShell 技能连载 - 识别 Windows 类型
WMI 返回每个不同的 Windows SKU 的密码编号:
1 | PS> Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -ExpandProperty OperatingSystemSKU |
要将此数字转换为有意义的文本(例如出于报告目的),请尝试以下操作:
1 | $OperatingSystemSKU = @{ |
输出将添加一个具有友好名称的新 OperatingSystemSKUText 属性:
Caption OperatingSystemSKU OperatingSystemSKUText
------- ------------------ ----------------------
Microsoft Windows 10 Pro 48 PRODUCT_PROFESSIONAL
PowerShell 技能连载 - 操作系统的启动和安装时间
WMI 类 Win32_OperatingSystem 提供了有关许多日期时间信息的丰富信息,包括上次启动的日期和安装时间:
1 | $dateTimeProps = 'InstallDate', 'LastBootupTime', 'LocalDateTime', 'CurrentTimeZone', 'CountryCode' |
结果看起来像这样:
InstallDate : 03.09.2019 12:42:41
LastBootupTime : 03.05.2020 12:15:45
LocalDateTime : 04.05.2020 10:43:55
CurrentTimeZone : 120
CountryCode : 49
如果您想知道系统运行了多少分钟,或者自安装以来已经过去了几天,请使用 New-TimeSpan:
1 | $os = Get-CimInstance -ClassName Win32_OperatingSystem |
结果看起来像这样:
Your copy of Windows was installed 243 days ago.
Your system is up for 1.353 minutes.
Get-CimInstance cmdlet可用于在本地和远程计算机上查询信息(前提是您具有适当的权限)。有关如何远程使用Get-CimInstance的更多信息,请访问https://powershell.one/wmi/remote-access。
每个 Windows 操作系统都有一个描述,您可以使用以下命令查看(和更改)该描述:
1 | PS> control sysdm.cpl |
要通过 PowerShell 自动执行此操作,请使用以下命令:
1 | # change operating system description |
PowerShell 技能连载 - 在网格视图窗口中将对象数据显示为表格
通常,当将单个对象输出到 Out-GridView 时,将得到一行数据,并且每个属性都以一列的形式出现:
1 | Get-ComputerInfo | Select-Object -Property * | Out-GridView |
这样难以查看和过滤特定信息。只需将对象转换为有序哈希表,即可将其显示为网格视图窗口中的表。此外,您现在还可以消除空属性并确保对属性进行排序:
1 | # make sure you have exactly ONE object |
只要 $info 恰好包含一个对象,该方法就可以完美地工作。例如,您可以调整代码,并使用 “Get-AdUser -Identify SomeName -Properties *“ 代替 “Get-ComputerInfo“ 来列出给定用户的所有 Active Directory 属性。只要确保您精确地指定了一个用户即可。
由于此方法将对象转换为键值对,因此不适用于多个对象。
WMI 和 Get-CimInstance 可以为您提供许多有用的信息,但是返回的对象通常包含许多空属性:
1 | PS> Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object -Property * |
另外,属性不一定要排序。您可以通过识别和排序不为空的属性来进行修复:
1 | # get all WMI information |
通常,您的代码需要声明某些先决条件。例如,您可能要确保给定的文件夹存在,并使用如下代码:
1 | # path to download files to |
您可以开始使用断言函数库,而不必一遍又一遍地写代码。这是确保文件夹存在的一种:
1 | filter Assert-FolderExists |
使用此函数,您的代码将变得更加整洁。这些代码将文件夹路径分配给变量,并同时确保文件夹存在:
1 | # making sure a bunch of folders exist |
在此处阅读有关此技术的更多信息:https://powershell.one/code/10.html。
无需外部“局域网唤醒”工具了。如果要唤醒网络计算机,只需告诉 PowerShell 目标计算机的 MAC 地址即可。这是一个组成 magic packet 并唤醒机器的函数:
1 | function Invoke-WakeOnLan |
运行该函数后,可以通过以下方法唤醒计算机:
1 | Invoke-WakeOnLan -MacAddress '24:EE:9A:54:1B:E5', '98:E7:43:B5:B2:2F' -Verbose |
要找出目标机器的MAC地址,请在目标机器上运行此行代码或通过远程处理:
1 | Get-CimInstance -Query 'Select * From Win32_NetworkAdapter Where NetConnectionStatus=2' | Select-Object -Property Name, Manufacturer, MacAddress |
可以在这里找到更多信息:https://powershell.one/code/11.html。