我正在嘗試更新 Htm 檔案中的徽標,我們有兩個路徑需要替換
以下一個作業正常并被替換。
原始字串
<img src=C:\ProductName\ProductNameClient\webapps\ProductNameClient\assets\img\logo\logo.jpg alt='ProductName Logo'>
由于轉義序列問題而更新,我們在 Powershell 中使用以下字串來搜索原始字串
<img src=C:\\ProductName\\ProductNameClient\\webapps\\ProductNameClient\\assets\\img\\logo\\logo.jpg alt='ProductName Logo'>
替換字串
<img src=../../ProductNameNew/ProductNameNewLogo.png alt='ProductNameNew Logo'>
PowerShell 腳本對此字串作業正常
Get-ChildItem -Path (Get-Item .).FullName -Recurse -File *.htm | ForEach-Object {
$content = Get-Content -Path $_.FullName
if($content -match "<img src=C:\\ProductName\\ProductNameClient\\webapps\\ProductNameClient\\assets\\img\\logo\\logo.jpg alt='ProductName Logo'>"){
$content -replace "<img src=C:\\ProductName\\ProductNameClient\\webapps\\ProductNameClient\\assets\\img\\logo\\logo.jpg alt='ProductName Logo'>","<img src=../../ProductNameNew/ProductNameNewLogo.png alt='ProductNameNew Logo'>" | Set-Content -Path $_.FullName
}}
我使用了相同的 powershell 腳本并為轉義序列更新字串
不使用此字串原始字串
<img src=C:\Program Files (x86)\ProductName\.\ProductNameConfigs\ProductNameOLDlogo.png alt='ProductName Logo'>
更新由于轉義序列問題
<img src=C:\\Program Files (x86)\\ProductName\\.\\ProductNameConfigs\\ProductNameOLDlogo.png alt='ProductName Logo'>
替換字串
<img src=../../../ProductNameNew/ProductNameNewLogo.png alt='ProductNameNew Logo'>
我使用了適用于先前更新的轉義序列,但現在它不起作用我在 powershell 中沒有得到任何錯誤來解決這個問題,腳本將執行,字串將保持不變并且在 powershell 中沒有錯誤
Get-ChildItem -Path (Get-Item .).FullName -Recurse -File *.htm | ForEach-Object {
$content = Get-Content -Path $_.FullName
if($content -match "<img src=C:\\Program Files (x86)\\ProductName\\.\\ProductNameConfigs\\ProductNameOLDlogo.png alt='ProductName Logo'>"){
$content -replace "<img src=C:\\Program Files (x86)\\ProductName\\.\\ProductNameConfigs\\ProductNameOLDlogo.png alt='ProductName Logo'>","<img src=../../../ProductNameNew/ProductNameNewLogo.png alt='ProductNameNew Logo'>" | Set-Content -Path $_.FullName
}}
當我運行并檢查它沒有更新時,有人可以提供一些輸入嗎
uj5u.com熱心網友回復:
有更多的字符,比如括號 ( (and )) 轉義,而不僅僅是\“原始字串”中的反斜杠 ( ) 被用作-match 正則運算式中的模式,這樣做:
[Regex]::Escape("<img src=C:\Program Files (x86)\ProductName\.\ProductNameConfigs\ProductNameOLDlogo.png alt='ProductName Logo'>")
<img\ src=C:\\Program Files \(x86\)\\ProductName\\\.\\ProductNameConfigs\\ProductNameOLDlogo\.png\ alt='ProductName\ Logo'>
因此:
...
$Pattern = [Regex]::Escape("<img src=C:\Program Files (x86)\ProductName\.\ProductNameConfigs\ProductNameOLDlogo.png alt='ProductName Logo'>")
if ($content -match $Pattern) { ...
無論如何,嘗試使用正則運算式決議 HTML通常是個壞主意。
相反,您可以考慮將專用的 HTML 決議器作為HtmlDocument類:
$Html = @'
<!DOCTYPE html>
<html>
<body>
<h2>HTML Images</h2>
<p>HTML images are defined with the img tag:</p>
<img src=C:\Program Files (x86)\ProductName\.\ProductNameConfigs\ProductNameOLDlogo.png alt='ProductName Logo'>
</body>
</html>
'@
function ParseHtml($String) {
$Unicode = [System.Text.Encoding]::Unicode.GetBytes($String)
$Html = New-Object -Com 'HTMLFile'
if ($Html.PSObject.Methods.Name -Contains 'IHTMLDocument2_Write') {
$Html.IHTMLDocument2_Write($Unicode)
}
else {
$Html.write($Unicode)
}
$Html.Close()
$Html
}
$Document = ParseHtml $Html
$Document.getElementsByTagName('img') |ForEach-Object {
if ( $_.nameProp -eq 'ProductNameOLDlogo.png' ) {
$_.src = [uri]::EscapeDataString('../../../ProductNameNew/ProductNameNewLogo.png')
$_.alt = 'ProductNameNew Logo'
}
}
@"
<!DOCTYPE html>
<html>
$($Document.body.outerHtml)
</html>
"@
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/526207.html
標籤:细绳视窗电源外壳
