Экранирование спецсимволов - предотвращает инъекции

 Проверка существования файла

     Резервное копирование перед изменением

     Обработка ошибок в PowerShell

     Более точное regex - заменяет только URL в XML атрибутах

     Улучшенная обработка групп в regex

     -NoNewline в Set-Content - сохраняет оригинальное форматирование
This commit is contained in:
Alexey Barabanov
2025-11-05 17:06:04 +03:00
parent a0520880ee
commit db1b0d9a5a

View File

@@ -1,5 +1,5 @@
@echo off
setlocal
setlocal enabledelayedexpansion
rem === Проверка аргументов ===
if "%~1"=="" (
@@ -16,21 +16,45 @@ if "%~2"=="" (
set "FILE=%~1"
set "NEWURL=%~2"
rem === Проверка существования файла ===
if not exist "%FILE%" (
echo ❌ Файл не найден: %FILE%
exit /b 1
)
rem === Экранирование для PowerShell ===
set "FILE_ESC=!FILE:'=''!"
set "NEWURL_ESC=!NEWURL:'=''!"
echo 🔄 Обработка файла: %FILE%
echo 🔗 Новый базовый URL: %NEWURL%
echo.
powershell -NoLogo -NoProfile -Command ^
$file = '%FILE%'; ^
$newUrl = '%NEWURL%'; ^
$content = Get-Content -Raw $file; ^
# шаблон: ищем http(s)://домен или IP:порт и сохраняем хвост, если есть
$pattern = '(?s)(https?:\/\/\w{3,}\.\w+\.\w{2,}|http:\/\/\d+\.\d+\.\d+\.\d+:\d+)(\/[^\s<"]*)?'; ^
# замена: если есть хвост — добавляем его обратно, иначе только базовый URL
$content = [regex]::Replace($content, $pattern, {
if ($matches[2]) { "$newUrl$($matches[2])" } else { "$newUrl" }
}); ^
Set-Content -Path $file -Value $content -Encoding UTF8
rem === Создание резервной копии ===
copy "%FILE%" "%FILE%.backup" >nul 2>&1
if !errorlevel! equ 0 (
echo 📂 Создана резервная копия: %FILE%.backup
) else (
echo ⚠️ Не удалось создать резервную копию
)
echo ✅ Замена завершена.
pause
powershell -NoLogo -NoProfile -Command ^
try { ^
$file = '%FILE_ESC%'; ^
$newUrl = '%NEWURL_ESC%'; ^
$content = Get-Content -Raw -Path $file -ErrorAction Stop; ^
# Более точное regex для URL в XML атрибутах
$pattern = '(?i)(?<==")(https?://\w{3,}\.\w+\.\w{2,}|http://\d+\.\d+\.\d+\.\d+:\d+)(/[^"<]*)?'; ^
$content = [regex]::Replace($content, $pattern, { ^
param($match); ^
if ($match.Groups[2].Success -and $match.Groups[2].Value) { "$newUrl$($match.Groups[2].Value)" } else { "$newUrl" } ^
}); ^
Set-Content -Path $file -Value $content -Encoding UTF8 -NoNewline; ^
echo "✅ Замена завершена успешно."; ^
} catch { ^
echo "❌ Ошибка: $($_.Exception.Message)"; ^
exit 1; ^
}
echo.
pause