2017-02-24 6 views
0

ファイルを消去します:のPowershellのアウトファイルには、私は、次のコマンドを使用して働いています

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

アイデアは、テキスト<None Include="packages.config" />を持ってSetup.csproj内の任意の行を削除することです。

しかし、私は上記のコマンドを実行すると、私の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に変更します。ただし、1つのステップで実行できる場合は、そのファイルを優先します。

上記のget-contentおよびselect-stringメソッドを使用し、SAMEファイルでOut-Fileを呼び出す方法はありますか?

(私はこのquestionから上記の例を得た、注意してください。)

+1

'(取得-コンテンツC:\ somepath \ Setup.csproj)' – PetSerAl

+0

@PetSerAlとwOxxOM - それはそれでした!新しいものも学びました。答えとして投稿すると、私は受け入れます! – Vaccano

答えて

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" ; 

は、一つのファイルにローカルでテストされています。

2

パイプラインは、先行するコマンドの出力全体を待つことなく、個々の項目を転送するため、パイプラインは各部分のbegin { }ブロックの作成時に初期化されます。あなたの場合、実際の処理が始まる前に出力ファイルストリームが作成され、入力を上書きします。

括弧でコマンドを囲み:

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

これはパイプラインを開始する前に囲まれたコマンドの完全な評価を強制的に、この場合、ファイル全体の内容は、文字列の配列として取り込まれ、次いで、このアレイが供給されパイプラインに挿入します。

それは基本的に一時変数に保存するのと同じです:

$lines = Get-Content C:\somepath\Setup.csproj 
$lines | Select-String ...... 
関連する問題