0

このスクリプトを使用して、いくつかのファイルのテキストを置き換えようとしています。PC にあるディレクトリでテストすると、ファイル全体の内容が置き換えられ続けます。私は何が欠けていますか?私はこれで非常に新しいです...

$CTPath = "C:\path1"
$ECTPath = "C:\path2"
$FileExistCT = Test-Path $CTPath
$FileExistECT = Test-Path $ECTPath

If ($FileExistCT -eq $True)
{
    $filenames = @("Filepath1.vxm", "Filepath2.vxm", "Filepath3.vxm")
    foreach ($file in $filenames){
    $outputfile="$file" + ".out"

    Get-Content $file | Foreach-object
{
    $_ -replace "DISTS2D = 636.5", "DISTS2D = 642.9" `
} | Set-Content $outputfile
}
}
ElseIf ($FileExistECT -eq $True)
{
    $filenames = @("Filepath1.vxm", "Filepath2.vxm", "Filepath3.vxm", "Filepath4.vxm", "Filepath5.vxm", "Filepath6.vxm", "FilePath7.vxm")
    foreach ($file in $filenames){
    $outputfile="$file" + ".out"

Get-Content $file | Foreach
{
     $_ -replace "DISTS2D = 636.5", "DISTS2D = 642.9" `
} | Set-Content $outputfile
}
}
Else {Write-Host "VXM Files Not Found. Verify file path and try again."}

私はおそらくこれについても非常に回り道をしています..しかし、私はこれを機能させる必要があります。VXM ファイルは、古いテキスト ファイルと同じように読み込まれます。このスクリプトを使用すると、ファイル全体が次のように上書きされます。

$_ -replace "DISTS2D = 636.5", "DISTS2D = 642.9" `

しかし、基本的な置換機能を使用してテストすると、問題なく動作します。

4

1 に答える 1

0

この構造の代わりに:

Get-Content $file | Foreach-object {
    $_ -replace "DISTS2D = 636.5", "DISTS2D = 642.9" `
} | Set-Content $outputfile

私はこれを提案します:

$search = [regex]::Escape("DISTS2D = 636.5")    
(Get-Content $file) -replace $search, "DISTS2D = 642.9" | Set-Content $outputfile

特殊文字 (ドット) は 1 つしかないため、エスケープされた正規表現は特に必要ありませんが、誤検知の一致が確実になくなります。

元のコードでは、入力ファイルの各行を正規表現で更新し、それを Set-Content に送信しています。Set-Content はデフォルトでは追加されないため、入力ファイルの最後の行のみを含める必要があります。に置き換えることもできますが、入力ファイルの内容全体に対して演算子をOut-File -Append使用するだけであれば、そのまま使用し-replaceても問題はありませんSet-Content

出力ファイルに 1 行のテキストが表示される理由がわかりません。1 行のテキストを取得していたので、Set-Content は最後の項目をパイプラインに入れているだけだと思いますが、コード行を更新されたテキストではなくファイルのコンテンツとして取得する理由がわかりませんでした。@msorens がコメントで私の結論に疑問を呈した後、いくつかの VMX ファイルでコードを試してみたところ、実際にうまくいったので、なぜ問題が発生したのかわかりません。

これを少し修正しました。

foreach ($file in $files){
    $outputfile = $file.FullName + ".out"
    Get-Content $file | Foreach-object {
        $_ -replace 'virtualHW.version = "7"', 'virtualHW.version = "andy"' `
    } | Set-Content $outputfile
}
于 2012-06-18T23:21:51.537 に答える