2014-10-01 13 views
0

Это похоже на то, что должно быть очень просто, но пока я не могу найти способ сделать это.Powershell v2 - Split Process.Commandline на части

У меня есть ниже сценарий:

$processName = "notepad.exe" 

    $filter = "name like '%"+$processName+"'" 
    $result = Get-WmiObject win32_process -Filter $filter 

    $counter=1 
    foreach($process in $result) 
     { 
      $desc = $process.Description 
      $commArr = $process.CommandLine -split"()" 
      $comm = $commArr[0] 
      $inst = $commArr[2] 

      write-host "$counter) -APPLICATION: $desc `r`n -LOCATION: $comm `r`n -INSTANCE: $inst" 
      $counter++ 
     }  
} 

Это говорит мне, сколько экземпляров данного приложения (в данном случае notepad.exe) работают. Она возвращает:

Application: "notepad.exe" 
LOCATION: "C:\Windows\system32\notepad.exe" 
Instance: " " 

Но Откуда мне просто нужно первую часть "C:\Windows\system32"

Я попытался split-path:

$commShort = split-path($comm)

, но я получаю сообщение об ошибке: Split-Path : Cannot find drive. A drive with the name '"C' does not exist.

Если я попробую это, вручную добавив местоположение, хотя , он отлично работает: $commShort = split-path("C:\Windows\system32\notepad.exe")

Есть ли какой-нибудь трюк?

ответ

1

Вы должны заменить

$commArr = $process.CommandLine -split"()" 
$comm = $commArr[0] 
$inst = $commArr[2] 

в вашей цикл с

$commArr = $process.CommandLine.Split() 
$comm = Split-Path $commArr[0] 
$inst = $commArr[1] 

Полный код:

$processName = "notepad.exe" 

$filter = "name like '%"+$processName+"'" 
$result = Get-WmiObject win32_process -Filter $filter 

$counter=1 
foreach($process in $result) 
{ 
    $desc = $process.Description 
    $commArr = $process.CommandLine.Split() 
    $comm = Split-Path $commArr[0] 
    $inst = $commArr[1] 

    write-host "$counter) -APPLICATION: $desc `r`n -LOCATION: $comm `r`n -INSTANCE: $inst" 
    $counter++ 
} 

Вы также можете использовать Write-Host (Split-Path $process.Path), чтобы получить C:\Windows\system32 внутри вас для цикла.

+0

Приветствия, первая часть, к сожалению, с той же ошибкой, что и исходная. Однако вторая часть ('Split-Path $ process.Path') работает. – IGGt

+0

Я бегу Powershell v4. Я запускаю код, используя PowerShell ISE на 32-разрядной версии Windows 7. Какую версию Windows & Powershell вы используете? – Ishan

+0

Это, вероятно, объяснит это тогда. Windows 7 64bit и Powershell v2 (у нас есть несколько старых серверов) – IGGt

0

Чтобы получить родительскую папку пути использования

Split-Path -Parent $thePath 

Параметр -parent переключатель указывает PowerShell просто возвращает путь с последней части разреза (но обработки корневых путей).

+0

ура, но, к сожалению, он не работает. Если я набираю $ commShort = split-path -parent $ comm, я все равно получаю ошибку. (добавление процесса вручную работает ОК, например, $ comm = "C: \ Windows \ system32 \ notepad.exe") – IGGt

+0

@IGGt Я подозреваю, что ваш '$ comm' не имеет того значения, которое вы ожидаете от него. ('Write-Debug' и' $ DebugPreference' или (для расширенных функций) '-Debug' очень полезно.) – Richard

+0

приветствия, это полезно знать. К сожалению, это не проблема в этом случае: «DEBUG:« C: \ Windows \ system32 \ notepad.exe »' – IGGt

Смежные вопросы