Упрощение разделения конвейера данных PowerShell из вывода команды - PullRequest
0 голосов
/ 14 февраля 2012

Я пытаюсь выполнить некоторую обработку на выходе команды psftp "ls". По сути, я хочу поместить все имена файлов, которые соответствуют определенным условиям, в массив. У меня есть это:

PS C:\path\to\pwd> $a = & "C:\Program Files (x86)\PuTTY\psftp.exe" -l myusername -batch -pw mypassword -b sftpbatch.txt myserver | where {$_.split(" ", [StringSplitOptions]'RemoveEmptyEntries')[0] -eq "-rw-r--r--"} | select-object {$_.split(" ", [StringSplitOptions]'RemoveEmptyEntries')[8]}

(Если вам нужны дополнительные сведения об этой команде, я могу их предоставить. Вывод очень похож на вывод команды "ls" в PowerShell.)

Мне кажется, что я могу добиться большего, сначала выбрав разделение, а затем отфильтровав его с помощью где. Когда я пытаюсь это:

$a = & <# ... #> | select-object {$_.split(" ", [StringSplitOptions]'RemoveEmptyEntries')} | where { $_[0] -eq "-rw-r--r--" }

Я получаю

Unable to index into an object of type System.Management.Automation.PSObject.

Как мне это упростить?

1 Ответ

2 голосов
/ 14 февраля 2012

Как-то так должно работать.

$a = & <#...#>| % {$b = $_ -split ' '|?{$_}; if($b[0] -eq '-rw-r--r--'){$b[8]}}

Если вы помещаете это в скрипт, я бы заменил псевдоним % на Foreach-Object, а псевдоним ? на Where-Object

Редактировать:

Вот более ориентированный на конвейер подход:

'-rw-r--r-- 1 2 3   4 5 6 7 test.txt'| 
    select @{Name='Words'; Expression={$_ -split ' '|where {$_}}}|
    where {$_.Words[0] -eq "-rw-r--r--"}|
    foreach {$_.Words[8]}
...