[Windows] PowerShell 使用指南

0 序

  • 不少 AI Agent (Codex、deepseek-hardness、claude 等)或 VSCode 等软件在 Windows 端都越加倾向于让用户使用 powershell 作为 CLI 命令运行环境。因此,未来大概率将长期使用 powershell 了。

1 使用指南

powershell 元信息操作

查看 PowerShell 版本

  • 方法1
# $PSVersionTable.PSVersion
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  5369
  • Major(主要版本):一般对应于软件的重大更新或功能改进。当主要版本号增加时,通常表示软件经历了重大的变化或添加了重要的功能。
  • Minor(次要版本):一般对应于软件的小的改进或修复。次要版本号的增加通常意味着在主要版本的基础上进行了一些改进,但并没有引入重大的变化。
  • Build(构建版本):构建版本号通常用于标识软件的特定构建或版本。它可能包含了一系列的编译、打包或发布过程中的更改。
  • Revision(修订版本):修订版本号通常用于标识软件的小的修复或调整。它通常在次要版本的基础上进行,用于指示软件的微小更新或修正。
  • 方法2
# Get-Host | Select-Object Version
Version
-------
5.1.19041.5369

这将返回一个对象,其中包含当前PowerShell主机的版本信息。

或 使用别名

# Select-Object Version

别名来源:PowerShell 的简称命令是由 Alias 提供的,这些别名为常用的 PowerShell 命令提供了更简洁的替代方式。
推荐文档:

  • 方法3: $PSVersionTable 变量

如果你想获得关于当前PowerShell环境更详细的信息,可以直接查看$PSVersionTable变量的全部内容而不仅仅是.PSVersion属性。
这将包括CLR版本、构建版本、PS兼容版本等信息。

# $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.1.19041.5369
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.5369
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
  • PSVersion(PowerShell 版本): 5.1.19041.5369
  • PSEdition(PowerShell 版本类型): 桌面版
  • PSCompatibleVersions(兼容的 PowerShell 版本):
  • BuildVersion(构建版本): 10.0.19041.5369
  • CLRVersion(公共语言运行时版本): 4.0.30319.42000
  • WSManStackVersion(WSMan 协议堆栈版本): 3.0
  • PSRemotingProtocolVersion(远程管理协议版本): 2.3
  • SerializationVersion(序列化版本): 1.1.0.1

查看 .NET 版本

  • 查询.NET版本

虽然这不直接反映PowerShell的版本,但了解当前PowerShell环境运行在哪个版本的.NET上也是很重要的。这对于理解某些功能的可用性尤其关键。

# [Environment]::Version
Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  42000

查看安装的模块版本

如果你想了解特定PowerShell模块的版本,可以使用Get-Module命令配合-ListAvailable参数。这对于排查模块兼容性问题很有帮助。

下述命令列出了所有可用模块及其版本,你可以通过增加| Where-Object { $_.Name -eq "ModuleName" }来过滤特定模块的信息。

# Get-Module -ListAvailable | Select-Object Name,Version | Where-Object { $_.Name -eq "ModuleName" }
如:PS E:\xxx\Code-Snippets> Get-Module -ListAvailable | Select-Object Name,Version | Where-Object { $_.Name -eq "WindowsSearch" } 
Name          Version
----          -------
WindowsSearch 1.0.0.0


# Get-Module -ListAvailable | Select-Object Name,Version
Name                                      Version  
----                                      -------
Microsoft.PowerShell.Operation.Validation 1.0.1
PackageManagement                         1.0.0.1
Pester                                    3.4.0
PowerShellGet                             1.0.0.1
PSReadline                                2.0.0
AppBackgroundTask                         1.0.0.0
AppLocker                                 2.0.0.0
AppvClient                                1.0.0.0
Appx                                      2.0.1.0
AssignedAccess                            1.0.0.0
BitLocker                                 1.0.0.0
BitsTransfer                              2.0.0.0
BranchCache                               1.0.0.0
CimCmdlets                                1.0.0.0
ConfigCI                                  1.0
Defender                                  1.0
DeliveryOptimization                      1.0.2.0
DirectAccessClientComponents              1.0.0.0
Dism                                      3.0
DnsClient                                 1.0.0.0
EventTracingManagement                    1.0.0.0
International                             2.0.0.0
iSCSI                                     1.0.0.0
ISE                                       1.0.0.0
Kds                                       1.0.0.0
LanguagePackManagement                    1.0
LAPS                                      1.0.0.0
Microsoft.PowerShell.Archive              1.0.1.0
Microsoft.PowerShell.Diagnostics          3.0.0.0
Microsoft.PowerShell.Host                 3.0.0.0
Microsoft.PowerShell.LocalAccounts        1.0.0.0
Microsoft.PowerShell.Management           3.1.0.0
Microsoft.PowerShell.ODataUtils           1.0
Microsoft.PowerShell.Security             3.0.0.0
Microsoft.PowerShell.Utility              3.1.0.0
Microsoft.WSMan.Management                3.0.0.0
MMAgent                                   1.0
MsDtc                                     1.0.0.0
NetAdapter                                2.0.0.0
NetConnection                             2.0.0.0
NetEventPacketCapture                     1.0.0.0
NetLbfo                                   2.0.0.0
NetNat                                    1.0.0.0
NetQos                                    2.0.0.0
NetSecurity                               2.0.0.0
NetSwitchTeam                             1.0.0.0
NetTCPIP                                  1.0.0.0
NetworkConnectivityStatus                 1.0.0.0
NetworkSwitchManager                      1.0.0.0
NetworkTransition                         1.0.0.0
PcsvDevice                                1.0.0.0
PersistentMemory                          1.0.0.0  
PKI                                       1.0.0.0
PnpDevice                                 1.0.0.0
PrintManagement                           1.1
ProcessMitigations                        1.0.12
Provisioning                              3.0
PSDesiredStateConfiguration               1.1
PSDiagnostics                             1.0.0.0
PSScheduledJob                            1.1.0.0
PSWorkflow                                2.0.0.0
PSWorkflowUtility                         1.0.0.0
ScheduledTasks                            1.0.0.0
SecureBoot                                2.0.0.0
SmbShare                                  2.0.0.0
SmbWitness                                2.0.0.0
StartLayout                               1.0.0.2
Storage                                   2.0.0.0
StorageBusCache                           1.0.0.0
TLS                                       2.0.0.0
TroubleshootingPack                       1.0.0.0
TrustedPlatformModule                     2.0.0.0
UEV                                       2.1.639.0
VpnClient                                 2.0.0.0
Wdac                                      1.0.0.0
Whea                                      2.0.0.0
WindowsDeveloperLicense                   1.0.0.0
WindowsErrorReporting                     1.0
WindowsSearch                             1.0.0.0
WindowsUpdate                             1.0.0.0

查询特定应用或组件版本

  • 在某些情况下,你可能需要查询系统上特定应用程序或组件的版本,这可以通过多种方式实现,包括使用Get-AppxPackage、Get-ItemProperty等命令。例如,查询Windows商店应用版本:
Get-AppxPackage Microsoft.WindowsStore | Select-Object Name,Version
Name                   Version        
----                   -------
Microsoft.WindowsStore 22412.1401.15.0

使用WMI/CIM查询操作系统版本

  • 虽然这不直接关联到PowerShell版本,但了解操作系统版本对于编写兼容脚本也很重要。可以使用WMI(Windows Management Instrumentation)或CIM(Common Information Model)来查询。
# Get-CimInstance Win32_OperatingSystem | Select-Object Caption, Version, BuildNumber
Caption                  Version    BuildNumber
-------                  -------    -----------
Microsoft Windows 10 专业版 10.0.19045 19045

# Get-WmiObject Win32_OperatingSystem | Select-Object Caption, Version, BuildNumber
Caption                  Version    BuildNumber
-------                  -------    -----------
Microsoft Windows 10 专业版 10.0.19045 19045

访问注册表获取版本信息

对于某些特定的应用程序或组件,可能需要直接从Windows注册表中读取版本信息。这通常涉及到使用Get-ItemProperty访问注册表路径。

# Get-ItemProperty 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion' | Select-Object ProductName, CurrentVersion, CurrentBuild
ProductName    CurrentVersion CurrentBuild
-----------    -------------- ------------
Windows 10 Pro 6.3            19045

查看 PowerShell 安装路径

  • 在某些情况下,查看PowerShell的安装路径也可以提供一些版本相关的线索,尤其是当你在系统上安装了多个版本时。

例如,PowerShell Core(PowerShell 6及以上版本)通常安装在不同的路径下,这与Windows PowerShell(5.1及以下版本)有所区别。

# (Get-Command powershell).Source
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

或者对于PowerShell Core

# (Get-Command pwsh).Source

PowerShell:5.1.19041.5369 会报错: “Get-Command : 无法将“pwsh”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”

查询 PowerShell 权限开启情况

# Get-ExecutionPolicy
RemoteSigned

这将返回当前 PowerShell 执行策略。

  • 执行策略决定了哪些脚本可以在系统上运行。可能的执行策略包括:
  • Restricted(限制):不允许在系统上运行任何脚本。
  • RemoteSigned(远程签名):允许在本地计算机上运行本地创建的脚本,但从远程下载的脚本必须具有数字签名。
  • AllSigned(全部签名):只允许运行数字签名的脚本。
  • Unrestricted(不受限制):允许在系统上运行任何脚本,包括未签名的脚本。
  • 如果您需要更改执行策略,可以使用 Set-ExecutionPolicy 命令。

例如,要将执行策略设置为 RemoteSigned,可以执行以下命令:

Set-ExecutionPolicy RemoteSigned

将会访问/修改注册表的项:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

请注意,更改执行策略需要管理员权限

  • 管理 PowerShell 权限的其他命令,包括:
  • Set-ExecutionPolicy:设置 PowerShell 执行策略。如上例所示,可以使用此命令更改执行策略。
  • Get-ExecutionPolicy -List:显示系统中所有可用的执行策略,以及每个策略的优先级。
  • Test-Path:测试指定路径的存在。这可用于在运行脚本之前检查文件或目录是否存在。
  • Get-ExecutionPolicy -Scope:获取指定范围内的执行策略。您可以指定范围为 Process(当前进程)、CurrentUser(当前用户)、LocalMachine(本地计算机)或 CurrentUser, LocalMachine(当前用户和本地计算机)。
  • Set-ExecutionPolicy -Scope:设置指定范围内的执行策略。使用此命令可以为不同的范围设置不同的执行策略。

字符集系列

编码/字符集/代码页(CHCP/CodePage)

  • 常见字符集
20127    us-ascii    US-ASCII (7 位) 
28591    iso-8859-1    ISO 8859-1 拉丁语 1;西欧 (ISO)

936    gb2312    ANSI/OEM 简体中文 (中国、新加坡) ;简体中文 (GB2312) 
950    big5    ANSI/OEM 繁体中文 (台湾;中国香港特别行政区) :中国传统 (Big5)
54936    GB18030    Windows XP 及更高版本: GB18030 简体中文 (4 字节) ;简体中文 (GB18030)

1200    utf-16    Unicode UTF-16,iso 10646) 的小端字节顺序 (BMP;仅适用于托管应用程序
1201    unicodeFFFE    Unicode UTF-16,big endian 字节顺序;仅适用于托管应用程序
12000    utf-32    Unicode UTF-32, little endian 字节顺序;仅适用于托管应用程序
12001    32BE    Unicode UTF-32, big endian 字节顺序;仅适用于托管应用程序
65000    utf-7    Unicode (UTF-7)
65001    utf-8    Unicode (UTF-8)
  • 中文编码格式:GB2312、GBK、GB18030、Big5、UTF-8等。

  • Windows操作系统中,默认的编码格式GB2312(936)

  • 它是一种中文编码格式,支持中国大陆汉字,包括简体字和繁体字,但不支持其他语言、字符或文本格式。
  • GBK编码格式是对GB2312标准的一个扩展,它支持更多的汉字和符号,并且与GB2312兼容

  • GB18030是一个更加全面的中文编码格式,包括汉字、繁体字、日文字、韩文字和俄文字等多种字符,已经成为中国的国家标准

  • UTF-8Unicode编码格式的变体Unicode是一个可以表示世界上几乎所有字符的编码标准。

  • 详情参见

涉及PowerShell编码的变量

  • [Console]::OutputEncoding :控制台用于写入输出(即屏幕显示)的编码,使用的默认代码页(CodePage)由Windows系统区域设置确定,不论是PowerShell 还是Windows Powershell,简体中文为936代码页。

单纯解决显示汉字乱码之类问题的话就是要改这个。

https://docs.microsoft.com/zh-cn/dotnet/api/system.console.outputencoding

  • $OutputEncoding :为PowerShell和其他程序交互传送数据时使用的编码,6.0版本之前的Windows Powershell 默认为ASCII,之后的Powershell默认为UTF8
  • [Console]::InputEncoding :控制台用于读取输入(即屏幕输入)的编码

查看字符集

在使用 PowerShell 查看当前字符集时,在 Windows 在 PowerShell 中,你可以使用几种不同的方法来检查当前的字符集或代码页(Code Page)。
字符集通常指的是代码页,它是 Windows 系统用来将字符映射到数字值(通常是16位或32位)的机制

  • 方法 1:使用 chcp 命令

在 PowerShell 中,你可以使用外部命令 chcp 来查看当前的代码页。虽然这个命令通常是在命令提示符(cmd.exe)中使用的,但你也可以在 PowerShell 中调用它。

chcp

这将显示当前的代码页,例如:

Active code page: 936
或 
Active code page: 65001
或 ...
  • 方法 2:使用 PowerShell 的 [Console]::OutputEncoding
rem 打印控制台当前输出字符集
[Console]::OutputEncoding

out

PS E:\xxx\Code-Snippets> [Console]::OutputEncoding 

BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : False
CodePage          : 65001
  • 方法 2:使用 PowerShell 的 [System.Text.Encoding]::Default
    在 PowerShell 中,你可以通过查询 [System.Text.Encoding]::Default获取当前线程的默认编码。这通常反映了当前的代码页设置。
[System.Text.Encoding]::Default

这将返回一个 System.Text.Encoding 对象,其中包含关于当前默认编码的信息

例如:

BodyName CodePage EncoderFallback DecoderFallback IsReadOnly IsBrowserDisplay IsBrowserSave IsMailNewsDisplay IsMailNewsSave WindowsCodePage


windows-1252 1252 System.Text.EncoderReplacementFallback System.Text.DecoderReplacementFallback False False False False False False 1252

  • 方法 3:使用 Get-Console Cmdlet(适用于 PowerShell 7+)

在 PowerShell 7 及更高版本中,你可以使用 Get-Console cmdlet 来获取控制台的信息,包括当前的输入和输出编码。

Get-Console | Select-Object -Property InputEncoding, OutputEncoding

这将显示输入和输出编码,例如:

InputEncoding OutputEncoding


utf-8 windows-1252

  • 方法 4:使用 PowerShell 的 $OutputEncoding$InputEncoding 变量
  • 方法4.1 查看控制台$OutputEncoding$InputEncoding 变量 (推荐
# [Console]::OutputEncoding
BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001



# [Console]::InputEncoding
BodyName          : utf-8
EncodingName      : Unicode (UTF-8)
HeaderName        : utf-8
WebName           : utf-8
WindowsCodePage   : 1200
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
IsSingleByte      : False
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 65001
  • 方法4.2 可以直接查看 $OutputEncoding$InputEncoding 变量来了解当前的编码设置。 (不推荐)
$OutputEncoding.CodePage
$InputEncoding.CodePage

这将分别显示输出和输入编码的代码页。例如:

20127
或
1252
...

以上方法可以帮助你检查和了解 PowerShell 当前使用的字符集(代码页)。

更改 [Console]::OutputEncoding 编码为 UTF-8

方法1:修改注册表

  • 操作:
  • HKEY_CURRENT_USER\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe内更改(如没有则自己添加)CodePage(DWORD值十进制65001)。
  • 效果:对于直接启动PowerShell.exe有效,通过快捷方式启动、在新的Windows Terminal终端启动、在VSCode集成终端启动 均无效。
  • 原因解释:快捷方式启动PowerShell和直接运行PowerShell.exe有区别,快捷方式上可以附加设置(可以对快捷方式右键查看属性),会覆盖exe程序本身的设置。Terminal和VSCode不确定,可能是同理吧。

方法2:chcp 命令

  • chcp是源于cmd的命令,用于改变代码页CodePagePowerShell中也可使用,但需在启动PowerShell时使用才有效

因为 .net缓存启动时的代码页,在PowerShell会话中再使用chcp改变代码页会被忽略。
所以,可以实现目标,但要注意使用方法.。

chcp命令 + 控制台

CMDPowerShell可以开启一个UTF8的PowerShell,可运行 : powershell -NoExit -Command "chcp 65001"

注:powershell -? 可以看 -NoExit-Command的含义。

chcp命令 + 新的 Windows Terminal 终端
  • 新的 Windows Terminal 终端(未起效,不知原因):

设置 -> 配置文件 - > Windows PowerShell -> 命令行,在%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe 后面添加 -NoExit -Command "chcp 65001"没效果,不知为何。

chcp命令 + 修改VSCode 集成【终端(PS)】的PowerShell配置

  • 策略1:通过启动时加载的配置文件对PowerShell实现自定义 (推荐
  • 在设置 settings.json 中修改terminal.integrated.profiles.windows配置项,添加 args 参数内容,可以在启动PowerShell集成终端时更改代码页为UTF8
  • 操作路径:VSCode-首选项-设置-(输入搜索配置项,如:terminal.integrated.profiles.windows)-(选择)“在 setting.json 中编辑”
"terminal.integrated.profiles.windows": {
  "PowerShell": {
    "source": "PowerShell",
    "icon": "terminal-powershell",
    "args": ["-NoExit", "-Command", "chcp 65001"]  // 启动时更改控制台代码页为UTF8
  },
  "Windows PowerShell": {
    "icon": "terminal-powershell",
    "path": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
    "args": ["-NoExit", "-Command", "chcp 65001"]  // 启动时更改控制台代码页为UTF8
  },
}
  • 配置时,删除掉注释内容
  • 由于我的PowerShell版本是 5.1 (小于 6.0) ,只需要配PowerShell的即可,暂无需配置Windows PowerShell
  • 策略2:为在VSCode【终端(PowerShell)】窗口运行的Python程序,修改 terminal.integrated.env.windows 的参数配置 (不通用、不推荐)
"terminal.integrated.env.windows": {
    "PYTHONIOENCODING": "utf-8",
    "PYTHONLEGACYWINDOWSSTDIO": "utf-8"
}

文件与路径操作(数据集与代码管理)

PowerShell 处理的是“对象”而非纯文本,因此在处理文件路径时非常安全。

命令 (Cmdlet) 常见别名 用途与场景示例
pwd 列出当前所处路径
例:ls ./trino / dir ./trino
ls / dir -- 列出目录内容
例:ls ./trino / dir ./trino
Get-ChildItem ls / dir 列出/统计目录内容
例:递归统计数据集中的图片数量:
(Get-ChildItem ./dataset -Recurse -Filter *.jpg).Count
Test-Path - 检查文件/文件夹是否存在(写自动化训练脚本前必用)。
例:if (Test-Path ./model.pth) { ... }
Join-Path - 跨平台安全拼接路径,避免 Linux 和 Windows 斜杠混用问题。
例:Join-Path $pwd "data" "train"
Copy-Item / Move-Item cp / mv 复制或移动大型数据集/模型权重文件。
Rename-Item rni / ren 文件夹(文件)的重命名。
例如:Rename-Item -Path "C:\Test\old.txt" -NewName "new.txt"
例如:rni "old.txt" "new.txt"
Remove-Item rm / del 删除文件/目录(支持 -Recurse递归、正则)。
例如:Remove-Item -Recurse -Force H:\Github\deepseek-harness
例如:Remove-Item -Recurse -Force H:\Github\deepseek-harness\packages\*\node_modules
Get-Content cat 查看配置文件或小的文本数据集。
  • 获取命令别名的方法(Rename-Item为例): Get-Alias -Definition Rename-Item
PS xxx> Get-Alias -Definition Rename-Item

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ren -> Rename-Item
Alias           rni -> Rename-Item

文本、日志与 JSON 处理(调试与数据处理)

针对经常需要查看训练日志、解析 API 返回的 JSON的场景。

命令 别名 用途与场景示例
Select-String sls 类似 grep,在日志中搜索关键字。
例:查找 OOM 错误:Select-String -Path ./train.log -Pattern "CUDA out of memory"
Get-Content -Tail - 类似 tail,查看最新日志。
例:Get-Content ./train.log -Tail 50
ConvertFrom-Json - 将 JSON 字符串转为 PowerShell 对象,方便提取字段。
例:解析 HuggingFace 配置文件:
`Get-Content config.json
ConvertTo-Json - 将对象转为 JSON,用于构造 API 请求体。

进程管理与环境变量

这是软件工程师最高频的操作:配置环境、管理进程。

  • 设置环境变量(临时):

    $env:HF_HOME = "D:\huggingface_cache"   # 设置 HuggingFace 缓存路径
    $env:CUDA_VISIBLE_DEVICES = "0"         # 指定使用哪张 GPU
    $env:PYTHONPATH = ".\src"               # 添加项目源码到 Python 路径
    
  • 运行 Python 脚本:

    python train.py --epochs 10
    
  • 后台运行并记录日志:

    Start-Process python -ArgumentList "train.py" -RedirectStandardOutput "out.log" -RedirectStandardError "err.log"
    
  • 查看/终止进程:

    Get-Process python          # 查看所有 Python 进程
    Stop-Process -Name python -Force  # 强制结束(慎用)
    
  • 激活虚拟环境(Windows 特有):

    .\venv\Scripts\Activate.ps1  # 激活 venv
    # 如果遇到权限问题,需要设置执行策略:
    Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
    

网络与 API 调试

当你用 FastAPI / Flask / vLLM / Ollama 部署了LLM模型服务,PowerShell 可以直接充当客户端测试。

  • Invoke-RestMethod (类似 curl):
    # 测试本地 LLM 的 Chat Completions 接口
    $body = @{
        model = "meta-llama/Llama-2-7b"
        messages = @(@{role="user"; content="Hello!"})
    } | ConvertTo-Json -Depth 3
    
    Invoke-RestMethod -Uri "http://localhost:8000/v1/chat/completions" -Method Post -Body $body -ContentType "application/json"
    
  • Test-NetConnection (类似 ping/telnet):
    Test-NetConnection localhost -Port 8000  # 检查服务端口是否监听
    

查看系统资源(磁盘、内存、显卡等;辅助排错)

虽然 PowerShell 不能直接显示 GPU 显存,但可以配合系统命令或查看基础资源:

  • 查看各磁盘的剩余空间:

    Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, @{n='FreeGB';e={$_.FreeSpace/1GB}}
    
  • 查看内存总量与可用量(指标原始单位: KB,命令输出单位: GB):

    Get-CimInstance Win32_OperatingSystem | Select-Object @{n='TotalVisibleMemorySize';e={$_.TotalVisibleMemorySize/1024/1024}}, @{n='FreeMemory';e={$_.FreePhysicalMemory/1024/1024}}
    
  • 调用 nvidia-smi:

直接在 PS 里调用,查看 GPU 状态

PS H:\Github> nvidia-smi
Tue Sep  1 11:23:18 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 591.44                 Driver Version: 591.44         CUDA Version: 13.1     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                  Driver-Model | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce GTX 1650      WDDM  |   00000000:01:00.0 Off |                  N/A |
| N/A   45C    P8              1W /   50W |      43MiB /   4096MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

Linux/Mac 用户快速上手:常用别名对照

PowerShell 为了降低学习成本,内置了大量 Linux 风格的别名,在终端里直接敲这些完全没问题:

Linux/Mac 习惯 PowerShell 实际 Cmdlet
ls Get-ChildItem
cd Set-Location
cat Get-Content
grep Select-String
curl / wget Invoke-WebRequest (注:curl 是别名,但功能有差异,建议用 Invoke-RestMethod 处理 API)
kill Stop-Process
pwd Get-Location

Windows 数组

  • 在 Windows 的命令提示符(cmd)中,并没有像其他编程语言(如 C, C++, Python, Java 等)中那样内置支持动态数组的概念。

Windows cmd 本身是基于文本的模式,主要用于执行命令和批处理脚本,而不是进行复杂的编程任务。不过,你可以使用一些技巧和命令来模拟数组的功能,尤其是在批处理脚本中。

在 Windows cmd 中,虽然没有内建的数组类型,但你可以通过上述方法模拟数组的功能。对于更高级的数据处理需求,建议使用 PowerShell 或其他支持更复杂数据结构的脚本语言。

使用变量模拟数组

在批处理脚本中,你可以通过定义多个变量来模拟数组的功能。例如,你可以使用变量名加上索引的方式来访问这些“数组元素”。

示例:

@echo off
set array[0]=value0
set array[1]=value1
set array[2]=value2
 
echo %array[0]%
echo %array[1]%
echo %array[2]%

使用 FOR 循环遍历模拟数组

虽然批处理不支持真正的数组遍历,但你可以使用 FOR 循环来模拟遍历“数组”的行为。

示例:

@echo off
set array[0]=value0
set array[1]=value1
set array[2]=value2
 
for /L %%i in (0,1,2) do (
    echo %%array[%%i]%%
)

使用 FOR /F 循环从文件读取“数组”

如果你有一个文本文件,其中包含了多个值,每个值占一行,你可以使用 FOR /F 循环来读取这些值。

示例:假设 data.txt 文件内容如下:

value0
value1
value2
  • 读取并打印这些值的批处理脚本:
@echo off
for /F "tokens=*" %%A in (data.txt) do (
    echo %%A
)

使用 PowerShell 脚本进行更复杂的操作

对于需要更复杂数据结构(如真正的数组)的场景,可以考虑使用 PowerShell 脚本,它提供了更强大的数据处理能力。

示例:在 PowerShell 中创建和使用数组:

$array = @("value0", "value1", "value2")
foreach ($item in $array) {
    Write-Output $item
}

实战示例

CASE 一键启动带环境隔离的推理服务

# 设置环境变量
$env:TRANSFORMERS_CACHE = "D:\cache"
$env:CUDA_VISIBLE_DEVICES = "0"

# 激活环境(假设已创建)
.\venv\Scripts\Activate.ps1

# 启动 FastAPI 服务并重定向日志
Start-Process python -ArgumentList "-m", "uvicorn", "app:app", "--port", "8000" -RedirectStandardOutput "api.log"

# 测试服务
Start-Sleep -Seconds 3
Invoke-RestMethod http://localhost:8000/health

Z FAQ for Powershell

Q: 如何自行编写一个 .ps1 脚本?

编写一个 .ps1 脚本非常简单,本质上就是把你在 PowerShell 终端里敲的一系列命令,按顺序写进一个文本文件里

步骤 1:创建文件

用记事本(或 VS Code)新建一个文件,保存为 MyScript.ps1(注意后缀是 .ps1)。

步骤 2:编写脚本内容

这里给你一个 AI 开发工程师常用 的示例脚本:自动激活 Conda/Python 环境,并启动一个模型训练任务,同时记录日志。

# ==========================================
# 文件名: start_training.ps1
# 作用: 设置环境并启动训练
# ==========================================

# 1. 设置错误信息立即终止(类似 Python 的 strict 模式)
$ErrorActionPreference = "Stop"

# 2. 定义路径变量(使用 Join-Path 保证跨平台兼容)
$ProjectDir = Join-Path $PSScriptRoot ".." 
$LogFile = Join-Path $PSScriptRoot "train_log.txt"

Write-Host "========================================" 
Write-Host "AI Training Script Starter" -ForegroundColor Green
Write-Host "Project Directory: $ProjectDir"

# 3. 检查 Python 是否可用
if (-not (Test-Path (Get-Command python -ErrorAction SilentlyContinue).Path)) {
    Write-Error "Python 未安装或未添加到 PATH 环境变量!"
    exit 1
}

# 4. 设置环境变量(例如指定 GPU 和 HuggingFace 缓存)
$env:CUDA_VISIBLE_DEVICES = "0"
$env:PYTHONPATH = $ProjectDir

# 5. 执行训练命令,并将输出重定向到日志
Write-Host "开始训练... 日志将写入 $LogFile"
python (Join-Path $ProjectDir "train.py") --epochs 50 --batch-size 32 *>> $LogFile

# 6. 检查是否执行成功
if ($LASTEXITCODE -eq 0) {
    Write-Host "训练成功完成!" -ForegroundColor Green
} else {
    Write-Error "训练失败,请查看日志: $LogFile"
}

步骤 3:解决“执行策略”限制(重要!)

PowerShell 出于安全考虑,默认禁止双击运行 .ps1 脚本。如果你直接双击或在终端里运行 .\start_training.ps1 报错,需要以管理员身份打开 PowerShell 并输入:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

(这允许你运行自己写的本地脚本,但从网上下载的脚本仍需签名。)

步骤 4:运行脚本

在 PowerShell 终端中,切换到脚本所在目录,然后输入:

.\start_training.ps1

或者,如果你不想改执行策略,也可以直接通过 powershell 命令调用:

powershell -ExecutionPolicy Bypass -File .\start_training.ps1

进阶技巧:给脚本传参数

你可以让 .ps1 像命令行工具一样接收参数。在脚本开头加上 param() 块:

param(
    [string]$ConfigPath = "default_config.yaml",
    [int]$Epochs = 10
)

Write-Host "使用配置文件: $ConfigPath, 训练轮数: $Epochs"
# 后面可以接 python train.py --config $ConfigPath --epochs $Epochs

运行方式:

.\start_training.ps1 -ConfigPath ".\configs\llama.yaml" -Epochs 100

X 参考文献

terminal.integrated.env.windows / terminal.integrated.profiles.windows (推荐做法) / ...

$PROFILE /

posted @ 2026-09-01 11:32  千千寰宇  阅读(1)  评论(0)    收藏  举报