PowerShell如何获取进程参数?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 参数 正文

核心概念:命令与参数

在深入之前,先明确一个基本概念:

  • 命令: 你要执行的可执行文件或脚本,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 Hidden
    Start-Process -FilePath "notepad.exe" -WindowStyle Hidden
  • 以管理员身份运行: -Verb RunAs
    Start-Process -FilePath "msconfig.exe" -Verb RunAs
  • 指定工作目录: -WorkingDirectory
    Start-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-ProcessGet-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

修改现有进程的参数

这是不可能的。

一旦一个进程启动并运行,它的命令行参数就已经确定,你不能像修改配置文件一样去修改一个正在运行的程序的参数,如果你需要改变程序的行为,你必须:

  1. 停止该进程。
  2. 新的参数**重新启动**它。

总结与最佳实践

场景 推荐方法 示例
启动新进程 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
修改进程参数 不支持,必须停止并重启。 -

关键点回顾:

  1. 启动时:用 Start-Process -ArgumentList 来精确控制参数传递。
  2. 查看时:用 Get-CimInstance Win32_Process 来获取进程的原始命令行,Get-Process 本身不提供此信息。
  3. 修改时:无法修改,只能重启。

希望这份详细的指南能帮助你更好地在 PowerShell 中处理进程参数!

-- 展开阅读全文 --
头像
mac pro 2012老版拆机
« 上一篇 今天
联想Air 2025 15拆机内部配置如何?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

标签列表

目录[+]