Powershell ForEach-Object: não é possível ligar o parâmetro

2

Estou tentando obter o proprietário de um processo usando este código:

(Get-WmiObject -class win32_process | where{$_.ProcessName -eq 'explorer.exe'}).getowner() | Foreach-Object user | out-string

Isso funciona muito bem no Windows 8, mas no Windows 7 recebo esta mensagem:

ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the "user" value of type "System.String" to type "System.Management.Automation.ScriptBlock". At C:\Program Files (x86)\Advanced Monitoring Agent GP\scripts60.ps1:1 char: 108 + (Get-WmiObject -class win32_process | where{$_.ProcessName -eq 'explorer.exe' }).getowner() | Foreach-Object <<<< user | out-string + CategoryInfo : InvalidArgument: (:) [ForEach-Object], Parameter BindingException + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand

    
por user3460112 25.03.2014 / 15:28

2 respostas

2

Por favor, modifique o iterador do usuário e experimente os itens 7 e 8:

(Get-WmiObject -class win32_process | 
    where{$_.ProcessName -eq 'explorer.exe'}).getowner() | 
    Foreach-Object {$_.user } | out-string 
    
por 25.03.2014 / 15:31
2

Você pode fazer isso com quebras de linha:

gwmi win32_process | where ProcessName -Match "explorer" | foreach {$_.GetOwner().User | Out-String}

Ou sem

gwmi win32_process | where ProcessName -Match "explorer" | foreach {$_.GetOwner().User}

Lembre-se de incluir seu script 'foreach' dentro de {} 's.

Por questão de integridade, eu digo que isso foi feito com o Powershell 3.0, portanto, não há {} para o cmdlet where-object e não $_ para a propriedade ProcessName.

    
por 25.03.2014 / 16:48

Tags