だから私はいくつかの大きなテキストファイルを並べ替え、特定のキーワードを含む行をすべて削除する必要があります。したがって、基本的に、これらの行がある場合:
これはテストではありません
これはテストです
たぶんテスト
間違いなくテストではない
そして、「not」でスクリプトを実行します。1行目と4行目を完全に削除する必要があります。
私は試してみました:
PS C:\Users\Admin> (Get-Content "D:\Logs\co2.txt") |
Foreach-Object {$_ -replace "3*Program*", ""} |
Set-Content "D:\Logs\co2.txt"
ただし、行全体ではなく、「プログラム」のみが置き換えられます。
これが私がすることです:
Get-Content .\in.txt | Where-Object {$_ -notmatch 'not'} | Set-Content out.txt
Snarkの行 は同じことを行いますが、すべてのファイルを配列にロードすることから始まります。これは、大きなファイルではメモリに関して問題になる可能性があります。
これは動作します:
(Get-Content "D:\Logs\co2.txt") -notmatch "not" | Out-File "D:\Logs\co2.txt"
-notmatchオプションを指定して 'Select-String'を使用することもできます。
Select-String 'not' .\input.txt -notmatch | % {$_.Line} | set-content output.txt
私はこれを機能させるために必要なだけで、次のことを思いつきました:
$InServerName = 'SomeServerNameorIPAddress'
$InFilePath = '\Sharename\SomePath\'
$InFileName = 'Filename.ext'
$OutServerName = 'SomeServerNameorIPAddress'
$OutFilePath = '\Sharename\SomePath\'
$OutFileName = 'Filename.out'
$InFile = -join('\\',$InServerName,$InFilePath,$InFilename)
$OutFile = -join('\\',$OutServerName,$OutFilePath,$OutFilename)
$FindStr = 'some string to match on'
$CompareStr = [scriptblock]::Create($FindStr)
$CompareStr
Get-Content $InFile | Where-Object {$_ -notmatch $CompareStr} | Set-Content $OutFile
Get-Content $OutFile
重要なのは、スクリプトブロックを使用する 'Where-Object'(中かっこで示される)は、スクリプトブロック作成イベントで変数を宣言する必要があるため、
$CompareStr = [scriptblock]::Create($FindStr)
ライン。
このように構成することで、関数を作成し、部分的に一致するテキスト文字列を渡し、渡された値を使用してスクリプトブロックを作成し、正しく機能させることができます。
上記の答えは、変数内で置き換えられる値を渡す方法を正しく説明していません。