PowerShell常用命令记录

获取版本号

PS C:\> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.19041.1682
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1682
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

历史记录

Get-History 命令可以显示当前会话的命令历史记录:

PS C:\> Get-History

如果需要从之前所有的历史记录中搜索命令,可以在 PowerShell 的历史文件中搜索:

PS C:\> findstr ffmpeg ${env:USERPROFILE}\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

环境变量

获取当前环境变量:

PS C:\> ls env:

或者通过 Get-ChildItem 命令:

PS C:\> Get-ChildItem -path ENV:

设置修改环境变量(下面例子设置 SSH_AUTH_SOCK 环境变量为 null 字符串):

PS C:\> $env:SSH_AUTH_SOCK='null'

删除环境变量(设置为空字符串就是删除):

PS C:\> $env:SSH_AUTH_SOCK=''

或者通过 Remove-Item 命令:

PS C:\> Remove-Item Env:\SSH_AUTH_SOCK

运行 cmd 命令

需要使用 cmd /c "<COMMAND>" 方式运行,例如运行 start 命令打开文件并获取返回值:

PS C:\> cmd /c "start /wait <file> & exit errorlevel"

命令输出

例如需要输出到文件:

PS C:\> XXX-cmd YYY | Out-File -FilePath out.txt

如果需要忽略输出:

PS C:\> XXX-cmd YYY | Out-Null

遍历文件目录

例如遍历 mp4 视频,输出完整路径:

PS C:\> Get-Item -Path "D:\xxx.mp4" | ForEach-Object { $_.FullName }

也可以遍历目录及子目录:

PS C:\> Get-ChildItem -Path "Z:\raw" -Recurse -Filter *.mp4 | ForEach-Object { $_.FullName }

也可以批量重命名:

PS C:\> Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace '.txt','.log' }

判断返回值

可以使用 $LASTEXITCODE 判断返回值。

例如使用 MediaInfo 命令获取所有 mxf 视频信息,只输出包含了有效编码日期的视频路径和信息:

PS C:\> Get-Item -Path "D:\xxx.mxf" | ForEach-Object { $result = MediaInfo $_.FullName; $result | findstr "Encoded date" | Out-Null; If ($LASTEXITCODE -eq 0) { $result | sls "Complete name|Duration|Encoded date" | Select-Object -First 3; Write-Host } }

上面使用 Write-Host 输出空行,如果还需要 Out-File 输出到文件,则可以换成 Write-Output ""

过滤命令输出

可以使用 findstr 命令过滤命令的输出,findstr 默认区分大小写,增加 /i 参数忽略大小写:

PS C:\> XXX --help | findstr /i "resize"

也可以使用 PowerShell 的 Select-String(简写 sls)来过滤,,Select-String 默认不区分大小写,增加 -CaseSensitive 参数区分大小写:

PS C:\> XXX --help | sls "Auto" -CaseSensitive

如果需要取前 3 行,可以:

PS C:\> XXX-cmd YYY | sls "Complete name|Duration|Encoded date" | Select-Object -First 3

base64

编码:

PS C:\> [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes("https://wiki.zohead.com/"))
aHR0cHM6Ly93aWtpLnpvaGVhZC5jb20v

解码:

PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("aHR0cHM6Ly93aWtpLnpvaGVhZC5jb20v"))
https://wiki.zohead.com/

如果是 UTF-16 编码,可以把 [System.Text.Encoding]::UTF8 换成 [System.Text.Encoding]::Unicode

hash

获取 SHA256 hash 值:

PS C:\> Get-FileHash path-to-file
Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          8C78C1FF580EF2468F4F62E98F7CD3D927808F42D3DBFD37E4A18172BE1AE132       path-to-file

获取 SHA512 hash 值并格式化成列表输出:

PS C:\> Get-FileHash path-to-file -Algorithm SHA512 | Format-List

将十六进制字符串 hash 值转换为 base64:

PS C:\> $hash = Get-FileHash path-to-file -Algorithm SHA512
PS C:\> [Convert]::ToBase64String([byte[]] -split ($hash.Hash -replace '..', '0x$& '))

如果是 PowerShell (Core) 7.1+ / .NET 5+ 以上版本,第二条命令可以直接用:

PS C:\> [System.Convert]::FromHexString($hash.Hash)

WMI 查询

可以直接使用 Get-WmiObject 命令进行 WMI 查询,例如获取 SMBIOS 信息:

PS C:\> Get-WmiObject -class Win32_Bios
PS C:\> Get-WmiObject -class Win32_BaseBoard
PS C:\> Get-WmiObject -class Win32_ComputerSystem

新版本 PowerShell 也可以使用 Get-CimInstance 命令,例如获取物理磁盘型号和序列号:

PS C:\> Get-CimInstance -Class Win32_DiskDrive | Select Model,SerialNumber

获取处理器名称和 CPUID:

PS C:\> Get-CimInstance -Class Win32_Processor | Select Name,Caption,ProcessorId

另外也可以使用 wmic 命令,例如获取 UUID 等信息:

PS C:\> wmic csproduct get uuid
PS C:\> wmic csproduct list full

获取驱动器列表

PS C:\> Get-PSDrive

获取物理磁盘列表

PS C:\> Get-Disk

获取 uptime

PowerShell 6.0 及以上版本可以直接使用 Get-Uptime 命令获取 uptime,老版本则需要计算一下:

PS C:\> (Get-Date) - (Get-CimInstance -Class Win32_OperatingSystem).LastBootUpTime

控制 Internet Explorer

Windows 10 等系统默认打开 IE 会直接跳到 Edge 浏览器,可以用 PowerShell 打开 IE:

PS C:\> (new-object -com "InternetExplorer.Application").visible = $true

调用 Shell 应用程序

例如遍历 Windows 快速访问 中的项目,并实现从 快速访问 中取消固定某个项目:

$qa = New-Object -ComObject shell.application
$items = $qa.Namespace("shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}").Items()
($items | Where-Object { $_.Path -EQ '\\192.168.1.158\pub' }).InvokeVerb('unpinfromhome')