我正在尝试使用以下代码获取进程的所有者:
(Get-WmiObject -class win32_process | where{$_.ProcessName -eq 'explorer.exe'}).getowner() | Foreach-Object user | out-string
这在 Windows 8 下运行良好,但在 Windows 7 中我收到此消息:
ForEach-Object:无法绑定参数“Process”。无法将“System.String”类型的“user”值转换为“System.Management.Automation.ScriptBlock”类型。在 C:\Program Files (x86)\Advanced Monitoring Agent GP\scripts\9660.ps1:1 char: 108 + (Get-WmiObject -class win32_process | where{$_.ProcessName -eq 'explorer.exe' }).getowner() | Foreach-Object <<<< user | out-string + CategoryInfo:InvalidArgument: (:) [ForEach-Object],参数 BindingException + FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand
答案1
请修改用户迭代器并在 7 和 8 上尝试:
(Get-WmiObject -class win32_process |
where{$_.ProcessName -eq 'explorer.exe'}).getowner() |
Foreach-Object {$_.user } | out-string
答案2
您可以使用换行符来做到这一点:
gwmi win32_process | where ProcessName -Match "explorer" | foreach {$_.GetOwner().User | Out-String}
或者没有
gwmi win32_process | where ProcessName -Match "explorer" | foreach {$_.GetOwner().User}
记得将 foreach“脚本”包装在{}
里面。
为了完整起见,我会说这是用 Powershell 3.0 完成的,因此没有{}
cmdlet where-object
,也没有$_
ProcessName 属性。