我希望能够键入快速,简单的命令来就地操作文件.例如: # prettify an XML fileformat-xml foo | out-file foo 这不起作用,因为管道设计为“贪婪”.一旦上游cmdlet处理第一行输入,下游cmdlet就会获取对
# 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 {}中获取锁,因此它不能解决这个特定的例子.
其他想法?
据我记得(现在无法测试),您可以使用命名空间符号将整个文件读入内存:${c:file1.txt} = ${c:file1.txt} -replace "a" "o"