首页 > 解决方案 > Powershell脚本 - 替换文件中的文本

问题描述

鉴于以下这些 powershell 功能。我正在尝试用我指定的另一个版本替换版本文本。我所有的路径都是正确的,并且我适当地输出了当前版本和新版本。当我去替换它们时,文件表明它已更改,但没有更改任何文本。

或者,我发现如果我将确切的当前版本指定为字符串变量并绕过 Get-VersionXXX 调用,它会毫无问题地替换版本。有什么明显的我做错了吗?

function Get-VersionAndDateFromFile([string] $versionFile, [string] $versionString)
{
    if (-Not(Test-Path -path $versionFile))
    {
        return ""
    }
    else
    {
        #foreach($line in [System.IO.File]::ReadLines($versionFile))
        (Get-Content -Path $versionFile -Raw) | ForEach-Object {
            $line = $_
            if ($line.Contains($versionString))
            {
                if ($line.Contains(""""))
                {
                    $tokens = $line.Split('\"')
                    return $tokens[1]
                }
            }
        }
    }

    return ""
}

function Get-VersionOnlyFromFile([string] $versionFile, [string] $versionString)
{
    [string] $versionAndDate = Get-VersionAndDateFromFile $versionFile $versionStriong
    return VersionFromVersionAndDateString $versionAndDate
}

function Get-VersionFromVersionAndDateString([string] $versionAndDateString)
{
    if (!$versionAndDateString)
    {
        return ""
    }
    else
    {
        if ($versionAndDateString.Contains(" "))
        {
            $newTokens = $versionAndDateString.Trim().Split(" ")          
            return $newTokens[0]
        }
        else
        {
            return $versionAndDateString
        }
    }
}

function ReplaceTextInFile([string] $fullPath, [string] $oldString, [string] $newString)
{
    Write-Host "Old " $oldString
    Write-Host "New " $newString
    ((Get-Content -path $fullPath -Raw) -replace $oldString,$newString) | Set-Content -Path $fullPath
}

调用代码:

[string] $newVersionString = "1.2.3.4.6   09-16-2021"
[string] $currentVersionString = Get-VersionAndDateFromFile $pathToVersionFile "SW_VERSION"
ReplaceTextInFile -fullPath $pathToVersionFile -oldString $currentVersionString -newString $newVersionString

finally:文件是一个名为 Version.h 的头文件

#define SW_VERSION "1.2.3.4.5 09-14-2021"

标签: powershell

解决方案


除非显式重定向,否则函数中的所有输出都会返回到管道。该return命令是多余的。因此,您在函数中发回两件事,第一是版本号,第二是空字符串(以 >>> 开头的行):

function Get-VersionAndDateFromFile([string] $versionFile, [string] $versionString)
{
    if (-Not(Test-Path -path $versionFile))
    {
        return ""
    }
    else
    {
        #foreach($line in [System.IO.File]::ReadLines($versionFile))
        (Get-Content -Path $versionFile -Raw) | ForEach-Object {
            $line = $_
            if ($line.Contains($versionString))
            {
                if ($line.Contains(""""))
                {
                    $tokens = $line.Split('\"')
>>>                 return $tokens[1]
                }
            }
        }
    }

>>> return ""
}

您将输出转换为字符串,从各方面来看,它看起来都是正确的,但如果您仔细观察,您会发现日期后面有一个空格:

PS C:\WINDOWS\system32> ">$currentVersionString<"
>1.2.3.4.5 09-14-2021 <

如果我们注释掉return该函数中的最后一个空间,那么您的替换应该可以正常工作。

function Get-VersionAndDateFromFile([string] $versionFile, [string] $versionString)
{
    if (-Not(Test-Path -path $versionFile))
    {
        return ""
    }
    else
    {
        #foreach($line in [System.IO.File]::ReadLines($versionFile))
        (Get-Content -Path $versionFile -Raw) | ForEach-Object {
            $line = $_
            if ($line.Contains($versionString))
            {
                if ($line.Contains(""""))
                {
                    $tokens = $line.Split('\"')
                    return $tokens[1]
                }
            }
        }
    }

#    return ""
}

老实说,这样做会简单得多:

function Get-VersionAndDateFromFile([string] $versionFile, [string] $versionString)
{
    if (Test-Path -path $versionFile)
    {
        Get-Content -Path $versionFile -Raw | Where-Object{$_ -match "$versionString\s+""(.+?)"""} | ForEach-Object {
            $Matches[1]
        }
    }
}

推荐阅读