From db1b0d9a5a1ffd4b5f8ae29708a18cd34a2a3409 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Wed, 5 Nov 2025 17:06:04 +0300 Subject: [PATCH 1/4] =?UTF-8?q?=20=20=20=20=E2=9C=85=20=D0=AD=D0=BA=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B5=D1=86=D1=81=D0=B8=D0=BC=D0=B2=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20-=20=D0=BF=D1=80=D0=B5=D0=B4=D0=BE=D1=82=D0=B2?= =?UTF-8?q?=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82=20=D0=B8=D0=BD=D1=8A=D0=B5?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Проверка существования файла ✅ Резервное копирование перед изменением ✅ Обработка ошибок в PowerShell ✅ Более точное regex - заменяет только URL в XML атрибутах ✅ Улучшенная обработка групп в regex ✅ -NoNewline в Set-Content - сохраняет оригинальное форматирование --- replace.bat | 52 ++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/replace.bat b/replace.bat index 6937056..397cc5c 100644 --- a/replace.bat +++ b/replace.bat @@ -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 \ No newline at end of file From 2b5e4d76ceccdde0f0c206c920c45824194ce086 Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Wed, 5 Nov 2025 17:17:16 +0300 Subject: [PATCH 2/4] chcp 65001 --- replace.bat | 53 +++++++++++++++++++++++------------------------------ 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/replace.bat b/replace.bat index 397cc5c..188db51 100644 --- a/replace.bat +++ b/replace.bat @@ -1,15 +1,16 @@ @echo off +chcp 65001 >nul setlocal enabledelayedexpansion rem === Проверка аргументов === if "%~1"=="" ( - echo ❌ Укажите путь к XML-файлу. - echo Пример: replace_url.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" + echo ERROR: Укажите путь к XML-файлу. + echo Пример: replace.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" + echo ERROR: Укажите новый базовый URL. + echo Пример: replace.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" exit /b 1 ) @@ -18,43 +19,35 @@ set "NEWURL=%~2" rem === Проверка существования файла === if not exist "%FILE%" ( - echo ❌ Файл не найден: %FILE% + echo ERROR: Файл не найден: %FILE% exit /b 1 ) -rem === Экранирование для PowerShell === -set "FILE_ESC=!FILE:'=''!" -set "NEWURL_ESC=!NEWURL:'=''!" - -echo 🔄 Обработка файла: %FILE% -echo 🔗 Новый базовый URL: %NEWURL% +echo Обработка файла: %FILE% +echo Новый базовый URL: %NEWURL% echo. rem === Создание резервной копии === copy "%FILE%" "%FILE%.backup" >nul 2>&1 if !errorlevel! equ 0 ( - echo 📂 Создана резервная копия: %FILE%.backup + echo Создана резервная копия: %FILE%.backup ) else ( - echo ⚠️ Не удалось создать резервную копию + echo Warning: Не удалось создать резервную копию ) -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; ^ - } +rem === Команда PowerShell с правильной кодировкой === +powershell -Command "[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; `` + `$file = '%FILE%'; `` + `$newUrl = '%NEWURL%'; `` + `$content = Get-Content -Raw -Path `$file; `` + `$pattern = '(http[s]?://[^\s\<\"\>]+)'; `` + `$content = `$content -replace `$pattern, `$newUrl; `` + Set-Content -Path `$file -Value `$content -Encoding UTF8 -NoNewline; `` + Write-Host 'SUCCESS: Замена завершена'" + +if errorlevel 1 ( + echo ERROR: Произошла ошибка при выполнении PowerShell +) echo. pause \ No newline at end of file From f0ab797a831abf08c3047a73535dc33c8124878a Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Wed, 5 Nov 2025 17:23:24 +0300 Subject: [PATCH 3/4] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BD=D0=BE=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D1=87=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- replace.bat | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/replace.bat b/replace.bat index 188db51..428f38a 100644 --- a/replace.bat +++ b/replace.bat @@ -2,51 +2,40 @@ chcp 65001 >nul setlocal enabledelayedexpansion -rem === Проверка аргументов === if "%~1"=="" ( - echo ERROR: Укажите путь к XML-файлу. - echo Пример: replace.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" + echo ERROR: Specify file path + echo Example: replace.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" exit /b 1 ) if "%~2"=="" ( - echo ERROR: Укажите новый базовый URL. - echo Пример: replace.bat "C:\path\to\file.xml" "https://gfx.tvstart.ru" + echo ERROR: Specify new URL + echo Example: replace.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 ERROR: Файл не найден: %FILE% +if not exist "!FILE!" ( + echo ERROR: File not found: !FILE! exit /b 1 ) -echo Обработка файла: %FILE% -echo Новый базовый URL: %NEWURL% +echo Processing: !FILE! +echo New URL: !NEWURL! echo. -rem === Создание резервной копии === -copy "%FILE%" "%FILE%.backup" >nul 2>&1 +copy "!FILE!" "!FILE!.backup" >nul 2>&1 if !errorlevel! equ 0 ( - echo Создана резервная копия: %FILE%.backup + echo Backup created: !FILE!.backup ) else ( - echo Warning: Не удалось создать резервную копию + echo WARNING: Backup failed ) -rem === Команда PowerShell с правильной кодировкой === -powershell -Command "[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; `` - `$file = '%FILE%'; `` - `$newUrl = '%NEWURL%'; `` - `$content = Get-Content -Raw -Path `$file; `` - `$pattern = '(http[s]?://[^\s\<\"\>]+)'; `` - `$content = `$content -replace `$pattern, `$newUrl; `` - Set-Content -Path `$file -Value `$content -Encoding UTF8 -NoNewline; `` - Write-Host 'SUCCESS: Замена завершена'" +powershell -Command "$content = [System.IO.File]::ReadAllText('%FILE%'); $content = $content -replace 'http[s]?://[^\s\<\"]+', '%NEWURL%'; [System.IO.File]::WriteAllText('%FILE%', $content, [System.Text.Encoding]::UTF8); Write-Host 'SUCCESS: Replacement completed'" if errorlevel 1 ( - echo ERROR: Произошла ошибка при выполнении PowerShell + echo ERROR: PowerShell command failed ) echo. From bbf4e2dd4a6f645589e9da8e6c99cceae263d3dc Mon Sep 17 00:00:00 2001 From: Alexey Barabanov Date: Wed, 5 Nov 2025 17:47:52 +0300 Subject: [PATCH 4/4] =?UTF-8?q?=D0=B5=D1=83=D1=8B=D0=B5=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- replace.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/replace.bat b/replace.bat index 428f38a..8f95f44 100644 --- a/replace.bat +++ b/replace.bat @@ -32,7 +32,7 @@ if !errorlevel! equ 0 ( echo WARNING: Backup failed ) -powershell -Command "$content = [System.IO.File]::ReadAllText('%FILE%'); $content = $content -replace 'http[s]?://[^\s\<\"]+', '%NEWURL%'; [System.IO.File]::WriteAllText('%FILE%', $content, [System.Text.Encoding]::UTF8); Write-Host 'SUCCESS: Replacement completed'" +powershell -Command "$content = [System.IO.File]::ReadAllText('%FILE%'); $pattern = 'http[s]?://[^/<\"]+(/[^<\"]*)?'; $content = $content -replace $pattern, '%NEWURL%$1'; [System.IO.File]::WriteAllText('%FILE%', $content, [System.Text.Encoding]::UTF8); Write-Host 'SUCCESS: Replacement completed'" if errorlevel 1 ( echo ERROR: PowerShell command failed