PowerShell 使用指南

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 命令, 提供瞭如下三種方式來獲取耗時:

  1. 獲取程序執行耗時, 但屏蔽了命令本身的輸出:

測量 ls 命令執行的耗時(只顯示耗時,ls的輸出會被隱藏)

Measure-Command { ls }

2)獲取程序執行耗時, 同時保持命令本身的輸出:

測量 ls 命令執行的耗時, 並保持ls自身的輸出

Measure-Command { ls | Out-Default }
  1. 獲取程序的耗時, 並且以毫秒爲單位進行輸出:
    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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章