2010-08-04 3 views
0

Я пытаюсь создать простой командный файл, который заменит строку в текстовом файле другой строкой, но сохранит все остальные строки в файле одинаково. Я нашел сценарий где-то в Интернете, который я немного изменил и придумал следующий код. Однако по какой-то причине этот код не повторяет любые строки, заканчивающиеся на «= 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 

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

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

Спасибо.

+0

возможно дубликат [Найти строку и заменить определенные буквы в пакетном файле] (HTTP : //stackoverflow.com/questions/17085650/find-a-string-and-replace-specific-letters-in-batch-file) –

+0

Возможный дубликат [Как вы можете найти и заменить текст в файле с помощью команды Windows -строчная среда?] (http://stackoverflow.com/questions/60034/how-can-you-find-and-replace-text-in-a-file-using-the-windows-command-line-envir) – Mofi

ответ

2

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

+0

Было бы здорово, un к счастью, это будет сделано на сотнях компьютеров с помощью утилиты удаленного управления. Поскольку на этих машинах нет установленного инструмента для третьей части, мне пришлось бы столкнуться с болью при установке этого инструмента удаленно (и убедиться, что он действительно устанавливается повсюду) до его запуска. Поскольку это действительно должно быть возможно (просто эта глупая маленькая ошибка = 0), это похоже на более логичный путь к установке новых вещей на всех машинах в организации. Любые другие идеи? Спасибо за ваш ответ. – wilbbe01

+0

С другой стороны, я собираюсь спросить администраторов лаборатории, если им будет интересно, если я брошу эту программу там. Я не понимаю, почему они должны заботиться. Мне нравится, как вы думаете. – wilbbe01

+0

Awesome, разрешение было предоставлено, и SSR будет передана всем машинам вместе с другими скриптами. Большое спасибо. – wilbbe01

0

Ваш %~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 
1

Проблема с оригинальным сценарием эта линия

echo.%~1>> new_prod.ini 

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

echo._sflag=0>> new_prod.ini 

0>> new_prod.ini будет перенаправлять стандартный intput to 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

Смежные вопросы