鑒于下面這些powerhell函式。我試圖用我指定的另一個版本來替換版本文本。我所有的路徑都是正確的,我也適當地輸出了當前版本和新版本。當我去替換它們時,檔案顯示它已經改變了,但沒有文本被改變。
另外,我發現如果我把準確的當前版本指定為一個字串變數,并繞過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))/span>
(Get-Content -Path $versionFile -Raw) | ForEach-Object {
$line = $_ {
if ($line.Contains($versionString)
{
if ($line.Contains("""))
{
$tokens = $line.Split(' "')
return $tokens[1]
}
}
}
}
return ""/span>
}
function Get-VersionOnlyFromFile title">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(" "/span>)
{
$newTokens = $versionAndDateString.Trim().Split(" "/span>)
return $newTokens[0]
}
else[/span
{
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。
最后:檔案是一個名為Version.h的頭檔案
。#define SW_VERSION "1.2.3.4.5 09-14-2021"
uj5u.com熱心網友回復:
除非明確重定向,否則函式中的所有輸出都會回傳到管道中。return命令是多余的。因此,你在函式中送回兩樣東西,第一是版本號,第二是一個空字串(以>>>開頭的行):
function Get- VersionAndDateFromFile([string] $versionFile, [string] $versionString)
{
if (-Not(Test-Path -path $versionFile)
{
return ""。
}
else "" }
{
#foreach($line in [System.IO.File]::ReadLines($versionFile))/span>
(Get-Content -Path $versionFile -Raw) | ForEach-Object {
$line = $_ {
if ($line.Contains($versionString)
{
if ($line.Contains("""))
{
$tokens = $line.Split('"'/span>)
>>> return $tokens[1]
}
}
}
}
>>> return ""/span>
}
你把輸出轉換為一個字串,從各方面來看,它看起來是正確的,但如果你仔細觀察,你會發現在日期后面有一個空格:
PS C:WINDOWSsystem32> ">$currentVersionString<"/span>
>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))/span>
(Get-Content -Path $versionFile -Raw) | ForEach-Object {
$line = $_ {
if ($line.Contains($versionString)
{
if ($line.Contains("""))
{
$tokens = $line.Split(' "')
return $tokens[1]
}
}
}
}
# return ""/span>
}
說實話,這樣做會簡單得多:
function Get- VersionAndDateFromFile([string] $versionFile, [string] $versionString)
{
if (Test-Path -path $versionFile)
{
Get-Content -Path $versionFile -Raw | Where-Object{$_ - match "$versionStrings ""( 。 ?)"""}。| ForEach-Object {
$Matches[1]
}
}
}
uj5u.com熱心網友回復:
運行你的替換函式,加入這2行,如下所示......
$old = $oldString -replace 's','s'; $old = $old -replace 's$';/p>
你會發現你在OldString變數的末尾捕捉到了一個額外的空格。像這樣。1.2.3.4.5ss09-16-2021s
這兩行解決了這個問題,并進行了替換......或者你可以修復你的Get-Version函式以捕獲正確的字串。
函式 ReplaceTextInFile([string] $fullPath, [string] $oldString, [string] $newString) { Write-Host "Old " $oldString Write-Host "New " $newString
$old = $oldString -replace 's'/span>,'s'/span>; #replaces with s。
$old = $old -replace 's$'; #removes trailing space at end of line[/span
$old = $oldString -replace 's'/span>,'s'。$old = $old -replace 's$'.
((Get-Content -path $fullPath -Raw) -replace $old,$newString) | Set-Content -Path$fullPath。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/326698.html
標籤:
上一篇:根據作業系統版本進行注冊表修改
