当前位置 : 主页 > 手机开发 > 其它 >

Powershell:您如何在一个管道中读写I / O?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我希望能够键入快速,简单的命令来就地操作文件.例如: # 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"
网友评论