核心概念:命令与参数
在深入之前,先明确一个基本概念:
- 命令: 你要执行的可执行文件或脚本,
notepad.exe,ping.exe,MyScript.ps1。 - 参数: 传递给命令的附加信息,告诉命令如何执行。
ping命令的-n 4参数表示发送 4 个数据包。
在 PowerShell 中,参数通常以 开头,后面跟着参数名和值(如果需要),-n 4。
启动一个新进程并传递参数
这是最常见的场景,在 PowerShell 中启动新进程主要有两种方式:Start-Process 和直接调用可执行文件。
使用 Start-Process (最强大、最灵活)
Start-Process 是专门用来启动进程的 cmdlet,功能非常强大,可以精确控制进程的启动方式(如窗口样式、凭据、工作目录等)。
基本语法:
Start-Process -FilePath <可执行文件路径> -ArgumentList <参数列表>
示例 1:打开记事本并指定一个文件
# -FilePath: 指定要运行的程序 # -ArgumentList: 指定要传递的参数,这里是要打开的文件路径 Start-Process -FilePath "notepad.exe" -ArgumentList "C:\Temp\MyLog.txt"
示例 2:Ping 一个地址,发送 5 个数据包
Start-Process -FilePath "ping.exe" -ArgumentList "-n 5 google.com"
注意:当参数包含空格时,强烈建议使用字符串数组来传递,以避免解析错误。
# 更安全的方式,特别是当参数本身包含空格时 Start-Process -FilePath "ping.exe" -ArgumentList "-n", "5", "google.com"
示例 3:使用命名参数
有些命令(如 powershell.exe 本身)支持命名参数,这样更清晰。
# 启动一个新的 PowerShell 窗口,并执行一条命令
Start-Process -FilePath "powershell.exe" -ArgumentList "-Command", "Get-Process | Where-Object {$_.CPU -gt 10}"
高级用法:
- 隐藏窗口:
-WindowStyle HiddenStart-Process -FilePath "notepad.exe" -WindowStyle Hidden
- 以管理员身份运行:
-Verb RunAsStart-Process -FilePath "msconfig.exe" -Verb RunAs
- 指定工作目录:
-WorkingDirectoryStart-Process -FilePath "cmd.exe" -WorkingDirectory "C:\Windows"
直接调用 (简单快捷)
如果只是简单地启动一个程序并传递参数,可以直接在命令行中输入,就像在 CMD 中一样,PowerShell 的命令解析器会处理引号和参数。
示例 1:打开记事本
notepad.exe C:\Temp\MyLog.txt
或者
notepad "C:\Temp\MyLog.txt" # PowerShell 会自动识别带空格的路径
示例 2:Ping 操作
ping -n 5 google.com
注意:
- 这种方式无法使用
Start-Process的高级功能,如-Verb RunAs或-WindowStyle。 - 如果程序路径中包含空格,最好用引号括起来。
获取正在运行的进程及其参数
这是一个比较棘手的问题,因为 Windows 操作系统出于安全原因,不会轻易地让一个进程读取另一个进程完整的命令行参数,我们仍然有几种方法可以尝试获取。
使用 Get-CimInstance (推荐,信息最全)
这是获取进程完整命令行参数最可靠的方法之一,它通过 WMI (Windows Management Instrumentation) 查询。
# 获取所有进程的 ID, 进程名 和 完整命令行 Get-CimInstance -ClassName Win32_Process | Select-Object ProcessId, Name, CommandLine
输出示例:
ProcessId Name CommandLine
--------- ---- ------------
1234 powershell.exe "C:\Program Files\PowerShell\7\pwsh.exe" -NoProfile -Command "Get-Process"
5678 notepad.exe "C:\Temp\MyLog.txt"
CommandLine 属性包含了启动该进程时使用的所有参数和路径,这正是我们想要的。
使用 Get-WmiObject (旧版方法)
这是 Get-CimInstance 的前身,在 PowerShell 2.0 和旧版系统中更常见,功能类似。
Get-WmiObject -Class Win32_Process | Select-Object ProcessId, Name, CommandLine
使用 Get-Process (内置,但信息有限)
Get-Process 是最常用的 cmdlet,但它不直接显示命令行参数,它主要显示进程的内存、CPU 等运行时信息。
Get-Process notepad
输出中不会有 CommandLine 字段。
如何配合使用?
你可以将 Get-Process 和 Get-CimInstance 结合起来,先用 Get-Process 找到进程,再用 Get-CimInstance 获取其详细信息。
# 1. 获取 notepad 进程的 ID $notepadProcess = Get-Process -Name notepad # 2. 使用 ID 从 WMI 获取其命令行 Get-CimInstance -ClassName Win32_Process -Filter "ProcessId = $($notepadProcess.Id)" | Select-Object -ExpandProperty CommandLine
修改现有进程的参数
这是不可能的。
一旦一个进程启动并运行,它的命令行参数就已经确定,你不能像修改配置文件一样去修改一个正在运行的程序的参数,如果你需要改变程序的行为,你必须:
- 停止该进程。
- 用新的参数**重新启动**它。
总结与最佳实践
| 场景 | 推荐方法 | 示例 |
|---|---|---|
| 启动新进程 | Start-Process (功能最全) |
Start-Process -FilePath "notepad.exe" -ArgumentList "C:\Temp\log.txt" |
| 直接调用 (最简单) | notepad.exe "C:\Temp\log.txt" |
|
| 获取进程参数 | Get-CimInstance (信息最准) |
Get-CimInstance Win32_Process \| Select-Object CommandLine |
| 修改进程参数 | 不支持,必须停止并重启。 | - |
关键点回顾:
- 启动时:用
Start-Process -ArgumentList来精确控制参数传递。 - 查看时:用
Get-CimInstance Win32_Process来获取进程的原始命令行,Get-Process本身不提供此信息。 - 修改时:无法修改,只能重启。
希望这份详细的指南能帮助你更好地在 PowerShell 中处理进程参数!
