我试图处理一个文件列表并将它们写到新的地方。对于每个文件,我正在制作一个带有文件名和新内容的新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}
这两者有什么区别?显然,房产确实存在。
答案 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
成员,因此出错。