我希望能够输入快速,简单的命令来就地操作文件。例如:
# prettify an XML file
format-xml foo | out-file foo
这不起作用,因为管道设计为“贪婪”。一旦上游cmdlet处理第一行输入,下游cmdlet就会获取对文件的写锁定,这会阻止上游cmdlet读取文件的其余部分。
有许多可能的解决方法:写入临时文件,将操作分成多个管道(将中间结果存储在变量中)或类似。但我认为这是一个非常普遍的任务,有人开发了一个快速,易于使用的快捷方式。
我试过了:
function Buffer-Object
{
[CmdletBinding()]
param (
[parameter(Mandatory=$True, ValueFromPipeline=$True)]
[psobject] $InputObject
)
begin { $buf = new-list psobject }
process { $buf.Add($InputObject) }
end { $buf }
}
format-xml foo | buffer-object | out-file foo
在某些情况下它可以正常工作。映射到一个简短的别名并进入像PSCX这样的通用发行版,它对于快速交互式任务来说“足够好”。不幸的是,似乎某些cmdlet(包括out-file)在其Begin {}方法中而不是在Process {}中获取锁定,因此它无法解决此特定示例。
其他想法?
答案 0 :(得分:7)
据我记得(现在无法测试),您可以使用命名空间符号将整个文件读入内存:
${c:file1.txt} = ${c:file1.txt} -replace "a" "o"