我正在使用以下命令:
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得到了上面的例子。)
答案 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" ;
使用一个文件在本地测试。