我正在尝试对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.
我该如何简化?
答案 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]}