管道输入到out-file

时间:2016-05-18 01:55:07

标签: powershell

我试图处理一个文件列表并将它们写到新的地方。对于每个文件,我正在制作一个带有文件名和新内容的新PS对象。然后我想写一个文件,其中包含已保存的文件名和修改后的内容。 这不起作用:

$ci | % { new-object -typename psobject -property @{out=(get-content  $_ | % { if ($_ -match '^[0-9].* [AB]: (.*)$') { $matches[1] } } |% { $_ -replace '(\.|\?|,|!)',''  } );
name=$_.Name} | 
Out-File -PSPath ("e:\training\deu\$($_.Name)") -InputObject $_.out }
The property 'out' cannot be found on this object. Verify that the property exists.
At line:1 char:418
+ ... training\deu\$($_.Name)") -InputObject $_.out }
+                    ~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], PropertyNotFoundException
+ FullyQualifiedErrorId : PropertyNotFoundStrict

但以下情况确实有效:

$all = $ci | % { new-object -typename psobject -property @{out=(get-content  $_ | % { if ($_ -match '^[0-9].* [AB]: (.*)$') { $matches[1] } } |% { $_ -replace '(\.|\?|,|!)','' } );
name=$_.Name}  }
$all | % {out-file -PSPath ("e:\training\deu\$($_.Name)") -InputObject $_.out}

这两者有什么区别?显然,房产确实存在。

1 个答案:

答案 0 :(得分:1)

var universitydata = ["Maine", "Harvard"]; 不会将管道列表扩展为Out-File变量。只有某些cmdlet可以执行此操作,例如$_Foreach-Object(更常见的是,遵循Begin,Process,End工作流程的任何cmdlet)

在第二种情况下,您对Where-Object的使用位于一个传递给$_.out的脚本块中。 Foreach执行一些魔术,它在管道数组上迭代,将Foreach-Object设置为数组元素,并调用您的scriptblock。

$_没有做任何事情。在您的第一个代码中,Out-File的值是$_的元素,由最外层的foreach设置。该对象不包含$ci成员,因此出错。