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
以管理员权限运行命令
PS C:\> Start-Process -Verb runAs powercfg -Args '/sleepstudy'
Junction 软链接
创建 Junction 软链接:
PS C:\> New-Item -ItemType Junction -Path "link_path" -Target "target_path"
显示软链接指向的目标:
PS C:\> (Get-Item "link_path").Target
删除软链接:
PS C:\> Remove-Item "link_path" -Force -Recurse
遍历文件目录
例如遍历 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')