例如:如果我运行
notepad.exe c:\autoexec.bat
,
如何在 PowerShell 的
c:\autoexec.bat
中获取Get-Process notepad
?
或者我怎样才能在 C# 的
c:\autoexec.bat
中获得Process.GetProcessesByName("notepad");
?
在 PowerShell 中,您可以通过 WMI 获取进程的命令行:
$process = "notepad.exe"
Get-WmiObject Win32_Process -Filter "name = '$process'" | Select-Object CommandLine
请注意,您需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为普通用户,它只对在您自己的上下文中运行的进程可见。
This answer is excellent, however for futureproofing and to do future you a favor, unless you're using pretty old powershell (in which case I recommend update!) Get-WMIObject 已被 Get-CimInstance 取代Hey Scripting Guy reference
试试这个
$process = "notepad.exe"
Get-CimInstance Win32_Process -Filter "name = '$process'" | select CommandLine
如果将以下代码放入 powershell
$PROFILE
文件中,您可以永久扩展 Process
对象类并使用 CommandLine
属性:
$TypeData = @{
TypeName = [System.Diagnostics.Process].ToString()
MemberType = [System.Management.Automation.PSMemberTypes]::ScriptProperty
MemberName = 'CommandLine'
Value = {
if (('Win32NT' -eq [System.Environment]::OSVersion.Platform)) { # it's windows
(Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine
} elseif (('Unix' -eq [System.Environment]::OSVersion.Platform)) { # it's linux/unix
Get-Content -LiteralPath "/proc/$($this.Id)/cmdline"
} elseif (('MacOSX' -eq [System.Environment]::OSVersion.Platform)) { # it's macos
# ???
}
}
}
Update-TypeData @TypeData -ErrorAction Ignore
NB:
是用Update-TypeData
调用的,因为在 pwsh 中(至少在版本 7.3.4 上),-ErrorAction Ignore
已经存在;CommandLine
抑制错误。作为替代方案,您可以检查属性是否存在,并仅在缺少属性的情况下执行-EA Ignore
。Update-TypeData
用作值的脚本块取自 pwsh 7.3.4 实际上 内部使用的内容,也适用于 Windows Powershell(其中
$IsWindows
等不存在)。
您可以通过在 pwsh 7.3.4 中运行以下命令来获取脚本块中的代码:
(([System.Diagnostics.Process]@{}) | gm | ? { $_.Name -ieq 'commandline' }) | select -expand Definition
.
然后你可以可靠地查询命令行(iif你有正确的权限,对于查询的进程(es),见[1],[2]):
get-process notepad.exe | select-object ProcessName, CommandLine
我正在使用 powershell 7.1,这似乎作为脚本属性内置到进程对象中:
> (Get-Process notepad)[0].CommandLine
"C:\WINDOWS\system32\notepad.exe"
有趣的是,您可以查看它的实现并看到它部分使用了 PsychoData 的答案:
($process | Get-Member -Name CommandLine).Definition
System.Object CommandLine {get=
if ($IsWindows) {
(Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine
} elseif ($IsLinux) {
Get-Content -LiteralPath "/proc/$($this.Id)/cmdline"
}
;}
在进程上运行 Get-Member 显示它是 System.Diagnostics.Process 的一个实例,但它有几个脚本化的属性。
其他属性是 FileVersion、Path、Product 和 ProductVersion。