PowerShell 使用指南
Started: 2024.03.12 09:00:00
Update: 2024-03-12 09:36:27
0. Purpose
在 Win11 中,默认的终端已经是 PowerShell, 包括 VSCode 里的默认终端, 这一方面改进了 cmd.exe 表达力不足的问题, 另一方面要求程序员们要学习一点 PowerShell 语法, 之前的 bat 语法虽然能继续通过 .cmd/.bat 脚本文件中使用, 但在执行单条命令时还是不如 PowerShell 命令来的直接。
1. 获取程序执行结束时的返回值
在 Linux 下用 echo $?
, 得到具体的数字。 在 powershell 下,echo $?
输出 True/False 不直观,有两种方法得到具体数值:
1). echo $LASTEXITCODE
2). 创建进程,获取和输出进程对象的 ExitCode
属性:
执行方法:
$process = Start-Process -FilePath "你的可执行文件路径" -ArgumentList "参数列表(如果有)" -NoNewWindow -PassThru -Wait
# 获取 main() 函数的返回值
$exitCode = $process.ExitCode
# 输出返回值
Write-Output "程序退出代码: $exitCode"
样例输出:
PS D:\> $process = Start-Process -FilePath "./a.exe"
PS D:\> $exitCode = $process.ExitCode
PS D:\> Write-Output "程序退出代码: $exitCode"
程序退出代码:
PS D:\> $process = Start-Process -FilePath "./a.exe" -NoNewWindow -PassThru -Wait
a - b = 255
PS D:\> $exitCode = $process.ExitCode
PS D:\> Write-Output "程序退出代码: $exitCode"""""""""
2. 获取程序执行耗时
在 Linux 下可以用 time ./testbed
。 PowerShell 不支持 time
命令, 提供了如下三种方式来获取耗时:
- 获取程序执行耗时, 但屏蔽了命令本身的输出:
测量 ls 命令执行的耗时(只显示耗时,ls的输出会被隐藏)
Measure-Command { ls }
2)获取程序执行耗时, 同时保持命令本身的输出:
测量 ls 命令执行的耗时, 并保持ls自身的输出
Measure-Command { ls | Out-Default }
- 获取程序的耗时, 并且以毫秒为单位进行输出:
Measure-Command 会返回一个 TimeSpan 对象,该对象包含了执行所需的总时间, 因此可以写的更复杂一些:
# 使用 Measure-Command 测量命令执行时间
$result = Measure-Command {
# 在这里放置你要执行的命令或脚本
Start-Process "你的程序路径" -ArgumentList "参数列表(如果有)" -NoNewWindow -Wait
}
# 输出程序运行耗时
Write-Output "程序运行耗时: $($result.TotalMilliseconds) 毫秒"
3. 查看和修改环境变量
3.1 查看所有环境变量
Linux 下使用 env
显示所有环境变量。 PowerShell 使用
Get-ChildItem Env:
获取所有环境变量, 不过像 PATH
这样的环境变量通常由于内容太多,显示不全(只显示单行,结尾截断了)。
e.g.
PS D:\github\xxxx> Get-ChildItem Env:
Name Value
---- -----
ALLUSERSPROFILE C:\ProgramData
ANDROID_NDK D:/soft/android-ndk/r21e
APPDATA C:\Users\aczz\AppData\Roaming
ChocolateyInstall C:\ProgramData\chocolatey
CMAKE_EXPORT_COMPILE_COMMANDS 1
hexagon-sdk_env_root D:\soft\Qualcomm\HexagonSDK\5.5.0.1
HOMEDRIVE C:
HOMEPATH \Users\aczz
LOCALAPPDATA C:\Users\aczz\AppData\Local
LUA_DEV d:\soft\Lua\5.1
LUA_PATH ;;d:\soft\Lua\5.1\lua\?.luac
NO_ASAN_SAVE_DUMPS MyAsanCrash.dmp
NUMBER_OF_PROCESSORS 12
OS Windows_NT
Path C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPo...
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.wlua;.lexe;.CPL
POWERSHELL_TELEMETRY_OPTOUT 1
UseMultiToolTask true
USERPROFILE C:\Users\aczz
VCPKG_DISABLE_METRICS 1
VCPKG_ROOT D:\github\vcpkg
3.2 打印某个环境变量
Linux 下使用 echo $PATH
的方式打印 PATH
环境变量的值, 使用 echo $ANDROID_NDK
打印环境变量 ANDROID_NDK
的值。
PowerShell 下也有 echo
命令, 但是环境变量要用 $env:PATH
, $env:ANDROID_NDK
的形式来获取, 即:
PS D:\> echo $env:PATH
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;
PS D:\> echo $env:ANDROID_NDK
D:/soft/android-ndk/r21e
3.3 临时修改某个环境变量
Linux 下使用 export PATH=$PATH:/usr/local/cmake-3.29.0/bin
这样的用法, PowerShell 不支持 export
命令。 直接给环境变量赋值即可, 变量可以是新的,也可以是已经存在的:
$env:MY_VAR = "somevalue"
e.g.
PS D:\> $env:MY_VAR = "somevalue"
PS D:\> echo $env:MY_VAR
somevalue
PS D:\> $env:MY_VAR = "somevalue2"
PS D:\> echo $env:MY_VAR
somevalue2
4. 重定向
Linux 下使用 ./testbed > log.txt 2>&1
来重定向标准输出和错误输出。 PowerShell 下仍然可以用 2>&1
.