Powershell的out-file在自己管道传输时清除文件

时间:2017-02-24 18:06:37

标签: powershell

我正在使用以下命令:

get-content C:\somepath\Setup.csproj | 
        select-string -pattern '<None Include="packages.config" />' -notmatch | 
        Out-File -filepath C:\somepath\Setup.csproj -force

我们的想法是删除Setup.csproj中包含文本<None Include="packages.config" />的所有行。

然而,当我运行上面的命令时,我的Setup.csproj文件被清空(它从一堆文本到没有测试)。

但是,如果我将命令更改为输出到新文件Setup2.csproj,则会创建新文件并具有我想要的内容:

get-content C:\somepath\Setup.csproj | 
        select-string -pattern '<None Include="packages.config" />' -notmatch | 
        Out-File -filepath C:\somepath\Setup2.csproj -force

这很好用,我想我可以删除原始文件并将Setup2.csproj重命名为Setup.csproj,但是如果可以一步完成,我会更喜欢它。

有没有办法使用上面的get-content和select-string方法,然后在SAME文件上调用Out-File?

(注意,我从这个question得到了上面的例子。)

2 个答案:

答案 0 :(得分:2)

管道传输单个项目,而不是等待累积前面命令的整个输出,因此管道在每个部分的begin { }块中创建时初始化。在您的情况下,输出文件流是在实际处理开始之前创建的,因此会覆盖输入。

将命令括在括号中:

(Get-Content C:\somepath\Setup.csproj) | Select-String ......

它强制在管道启动之前完成对封闭命令的评估,在这种情况下,整个文件内容将作为字符串数组提取,然后将此数组输入管道。

它与存储在临时变量中基本相同:

$lines = Get-Content C:\somepath\Setup.csproj
$lines | Select-String ......

答案 1 :(得分:0)

请你试试这个:

$filtered_content = Get-Content C:\somepath\Setup.csproj | select-string -pattern '<None Include="packages.config" />' -NotMatch ;
Remove-Item C:\somepath\Setup.csproj -Force  ;
New-Item C:\somepath\Setup.csproj -type file -force -value "$filtered_content"  ;

使用一个文件在本地测试。