Powershell:你怎么看&在一个管道中写I / O?

时间:2009-06-23 20:35:16

标签: powershell file-io pipeline

我希望能够输入快速,简单的命令来就地操作文件。例如:

# 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 {}中获取锁定,因此它无法解决此特定示例。

其他想法?

1 个答案:

答案 0 :(得分:7)

据我记得(现在无法测试),您可以使用命名空间符号将整个文件读入内存:

${c:file1.txt} = ${c:file1.txt} -replace "a" "o"