powershell - 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"
解决方案
除非显式重定向,否则函数中的所有输出都会返回到管道。该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]
}
}
}
推荐阅读
- ada - 带有“索引检查失败”的 CONSTRAINT_ERROR
- c# - 如何将对象列表设置为菜单 asp.net 的数据源?
- php - 在 PHP 中使用 onchange 函数创建多个相关的下拉菜单
- asp.net-core-mvc - SqlNullValueException when i use userManager.AddToRoleAsync method
- c++ - 没有成员作为唯一标识符的两个类实例的比较
- dart - 如何在 Flutter 中使抽屉按钮不可点击
- python - 如何将方法调用为代码按钮作为命令
- javascript - JS 和 React Native:将电话号码与来自服务器的电话号码匹配
- python - 想了解为什么 pandas truncate 不接受 Period 对象作为变量?
- java - 如何配置 Genson 以反序列化日期?