Я видел этот вопрос, но никогда с подходящим ответом на то, что мне нужно

Я работаю над удаленной технической поддержкой на компьютерных системах, и одна из вещей, которые мне часто приходится делать, - открывать ini-файлы и заменять определенные строки новыми.

в качестве примера скажем.

program.ini

статус программы = клиент

Ну, мне нужно изменить это на сервер, чтобы он читал

статус программы = сервер

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

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

Кто-нибудь знает, как это будет сделано чисто через пакет, так как я в растерянности. Не желая открывать редактор через командную строку, просто запустите его, и эта строка будет изменена в INI-файле.

Спасибо за любой вклад -Терра

1 ответ1

2

Этот пакетный файл также содержит некоторую диагностическую информацию. Строка setlocal ТРЕБУЕТСЯ, чтобы правильно играть с переменными в цикле.

Наиболее существенными побочными эффектами использования этого метода являются то, что удаляются пустые строки (они игнорируются FOR) и что ваши тесты (в разделе "выписать новое значение") очень специфичны: пробелы и регистр имеют значение. Вы можете выполнить регистронезависимое сопоставление с /i, но, поскольку вы включаете пробелы в свой вопрос, я подозреваю, что вы предпочитаете включать их. Вам нужно будет включить несколько строк, как сделано в этом разделе, чтобы повторить каждое возможное сравнение.

@ECHO OFF
setlocal enableDelayedExpansion

FOR /F "tokens=1,* delims==" %%i IN (test.ini) DO (
    SET sdone=0
    SET "sname=%%i"
    SET "svalue=%%j"
    ECHO.Name:  !sname!
    ECHO.Value: !svalue!

    :: write out headers
    IF "!sdone!"=="0" IF "!sname:~0,1!"=="[" SET sdone=1&&ECHO.Type:  Header&&ECHO.!sname!>>new.ini

    :: write out the new value if it's client
    IF "!sdone!"=="0" IF "!sname!"=="program status" IF "!svalue!"=="client" SET sdone=1&&ECHO.Type:  Rewrite&&ECHO.!sname!=server>>new.ini
    IF "!sdone!"=="0" IF "!sname!"=="program status " IF "!svalue!"==" client" SET sdone=1&&ECHO.Type:  Rewrite&&ECHO.!sname!=server>>new.ini

    :: write out anything else
    IF "!sdone!"=="0" SET sdone=1&&ECHO.Type:  Content&&ECHO.!sname!=!svalue!>>new.ini

    :: a little padding to read the debug info
    ECHO.
)

В конце вы захотите добавить что-то, чтобы перезаписать исходный файл, например:

copy /y new.ini test.ini

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .