简化PowerShell管道从命令输出中分割数据

时间:2012-02-14 16:49:05

标签: powershell pipe

我正在尝试对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]}

(如果你想了解关于该命令的更多细节,我可以提供它们。输出与PowerShell中“ls”命令的输出非常相似。)

在我看来,我可以通过首先选择拆分,然后在哪里过滤来做得更好。当我尝试这个时:

$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 个答案:

答案 0 :(得分:2)

这样的事情应该有效。

$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]}