@echo off setlocal enabledelayedexpansion rem === Проверка аргументов === if "%~1"=="" ( echo ❌ Укажите путь к XML-файлу. echo Пример: replace_url.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" exit /b 1 ) if "%~2"=="" ( echo ❌ Укажите новый базовый URL. echo Пример: replace_url.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" exit /b 1 ) 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. rem === Создание резервной копии === copy "%FILE%" "%FILE%.backup" >nul 2>&1 if !errorlevel! equ 0 ( echo 📂 Создана резервная копия: %FILE%.backup ) else ( echo ⚠️ Не удалось создать резервную копию ) 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