Найти и заменить в текстовом файле, используя командный файл - PullRequest
0 голосов
/ 04 августа 2010

Я пытаюсь создать простой командный файл, который заменит строку в текстовом файле другой строкой, но оставит все остальные строки в файле такими же.Где-то в интернете я нашел скрипт, который немного изменил и придумал следующий код.Однако по какой-то причине этот код не отображает строки, оканчивающиеся на «= 0», в новый текстовый файл, как должно быть, а отображает их на экране (даже с отключенным эхом).У кого-нибудь есть какие-либо предложения?

Большое спасибо.

@echo off
if exist prod.ini del new_prod.ini
for /f "tokens=*" %%a in (prod.ini) do call :AddText "%%a"
del prod.ini
rename new_prod.ini prod.ini
exit /b

:AddText %1
@echo on
echo %1
@echo off
set Text=%~1%
if "%Text%"=="server=server-2.domain.com" (
echo server=server-3.domain.com>> new_prod.ini
) else (
echo %~1%>> new_prod.ini
)
exit /b

В исходном файле есть несколько строк, подобных следующим, но новый файл после сценария пропустил эти строки.Сценарий работает точно так же, как и ожидалось на замену, а также на 20 или около того других строк.Только строки, которые выглядят следующим образом, вызывают проблемы.

_sflag=0
debug_lvl=0
sel_test_lvl=0
ipc_error_logging_lvl=0
ipc_client_debug_lvl=0
ipc_server_debug_lvl=0

Еще раз спасибо.

edit: Это будет выполняться на сотнях компьютеров в организации, и использование сторонних инструментов на самом деле не являетсявариант, так как установка другого приложения на всех машинах (хотя теоретически это возможно с помощью программного обеспечения для удаленного управления, которое мы будем использовать) нежелательна.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 августа 2010

Вместо того, чтобы искать и заменять с помощью команд сценария, как насчет использования инструмента командной строки, чтобы сделать то же самое? Это проще и быстрее (и работает), и вы можете написать это тоже. Google имеет тонну из них , например, SSR .

1 голос
/ 29 декабря 2011

Проблема с оригинальным скриптом в этой строке

echo.%~1>> new_prod.ini

Вот как выглядит строка после раскрытия одной из проблемных строк

echo._sflag=0>> new_prod.ini

0>> new_prod.ini перенаправит стандартный intput в new_prod.ini вместо перенаправления стандартного вывода, потому что 0 является символом для стандартного ввода Не то, что вы хотели, конечно. Обратите внимание, что стандартный вывод равен 1, а стандартная ошибка равна 2. >>file совпадает с 1>>file.

Эту проблему с исходным кодом легко устранить, поместив перенаправление в начало строки.

>>new_prod.ini echo.%~1

Существуют и другие потенциальные проблемы с исходным кодом. Использование Windows для обработки файлов действительно громоздко и медленно. Сторонние инструменты предпочтительнее, если у вас есть доступ к ним.

Иногда в любом случае требуется или требуется чистое пакетное решение.

Надежный поиск и замена без учета регистра см. В https://stackoverflow.com/a/8591185/1012053

Надежный поиск и замена с учетом регистра см. http://www.dostips.com/forum/viewtopic.php?f=3&t=2710

0 голосов
/ 24 марта 2011

Твоему %~1% не нужен финал %.

@echo off
if exist prod.ini del new_prod.ini
for /f "tokens=*" %%a in (prod.ini) do call :AddText "%%a"
del prod.ini
rename new_prod.ini prod.ini
exit /b

:AddText
@echo on
echo.%1
@echo off
set Text=%~1
if "%Text%"=="server=server-2.domain.com" (
  echo.server=server-3.domain.com>> new_prod.ini
) else (
  echo.%~1>> new_prod.ini
)
exit /b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...