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 文件与任何旧文本文件一样被读取。当我使用这个脚本时,它会覆盖整个文件:

$_ -替换“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

转义的正则表达式并不是特别需要,因为您只有一个特殊字符(点),但它可以确保没有误报匹配。

在您的原始代码中,您正在正则表达式更新输入文件的每一行并将其发送到 Set-Content。由于默认情况下 Set-Content 不附加,因此它应该只包含输入文件的最后一行。您可以将其替换为,Out-File -Append但如果您只是-replace对整个输入文件内容使用运算符,那么坚持使用Set-Content.

我不确定为什么您的输出文件中只有一行文本。我的猜测是因为您获得了 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 回答