2015-02-18 4 views
0

Я провел некоторое исследование по этой теме, но все, что я пробовал, не работает должным образом. Я просто хочу добавить счетчик к некоторым аспектам моего командного файла. Файл count.txt содержит:Обновление переменной в пакетном файле

Counters started on 2-18-15 
opened: 0 
actions: 0 

сценарий, который я написал до сих пор:

setlocal enabledelayedexpansion 

    for /F "usebackq tokens=2" %%r in (`findstr opened: counter.txt`) do (
    echo %%r 
    set opened=%%r 
    set /a opened=!opened!+1 
    echo opened= !opened! 
    ) 

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

Я указал! вместо%, используя некоторую отладку, он вытаскивает правильную переменную и добавляет к ней 1, текущая проблема заключается в том, что впоследствии она не сохраняет эту переменную.

+0

Возможный дубликат [Проблема с переменным назначением в пакетном файле DOS для цикла] (http: // stackoverflow.com/questions/3650146/variable-assign-problem-in-dos-batch-file-for-loop) –

ответ

0

Вам необходимо использовать задержанное расширение, чтобы правильно отображать переменные, установленные внутри блоков кода.

setlocal enabledelayedexpansion 
for /F "usebackq tokens=2" %%r in (`findstr /C:"opened:" counter.txt`) do (
    set opened=%%r 
    set /a opened=!opened!+1 
    echo opened=!opened! 
) 
+0

Извините, я забыл упомянуть, что у меня уже был setlocal enableddelayedexpansion, указанный в верхней части файла. Я изменил свой скрипт именно на то, что вы написали, но он по-прежнему не обновляется. Файл counter.txt выглядит точно так же после этого – Konan

+0

Является ли моя настройка скрипта для правильной записи в .txt-файл в том же месте, на котором оно происходит? – Konan

+0

@ Konan - Я просто заметил, что 'findstr' не вызывалось правильно. Я редактировал код. Кроме того, если counter.txt не находится в том же каталоге, что и пакетный скрипт, вам нужно включить полный путь в цикл for. – SomethingDark

0

Вы никогда не записываете информацию обратно в файл - вы просто эхом отдаете значение на экране.

Batch не имеет механизма для непосредственного изменения значения в файле. Вы должны написать новый файл с обновленной информацией, а затем заменить старый файл на новый.

Предполагая, что порядок строк не имеет значения, я хотел бы написать пакетный скрипт следующим образом:

@echo off 
setlocal 
for /f "tokens=2" %%N in ('findstr /bc:"opened: " counter.txt') do set /a opened=%%N+1 
>counter.txt.new (
    findstr /vbc:"opened: " counter.txt 
    echo opened: %opened% 
) 
move /y counter.txt.new counter.txt >nul 

После запуска сценария один раз, ваш файл counter.txt будет выглядеть так:

Counters started on 2-18-15 
actions: 0 
opened: 1 

Возможно, вы захотите сохранить порядок строк. Вы можете сделать это с помощью чистого пакетного скрипта, но я редко использую пакет для изменения текстовых файлов. Вместо этого, я хотел бы использовать мой JREPL.BAT utility - это быстрее, надежнее и проще (если вы понимаете регулярные выражения и элементарную JScript)

call jrepl "^(opened:\s*)(\d+)$" "$1+(Number($2)+1)" /j /f test.txt /o - 
+0

Я попытался использовать jrep1, я скопировал исходный код в свой собственный файл jrep1.bat, а затем выполнил команду вызова и изменил имя файла на counter.txt. Он неправильно обновил переменную счетчика. Я, скорее всего, ничего не сделал с этим! Я использовал первый введенный вами код, который перестраивает файл каждый раз, когда он открывается, и он работает правильно. Спасибо вам за помощь! – Konan

0
@ECHO OFF 
SETLOCAL 
(
for /F "delims=" %%a in (q28585447.txt) do (
for /F "tokens=1,2" %%q in ("%%a") do (
    IF "%%q"=="opened:" (CALL :REPLACE %%r) ELSE (ECHO %%a) 
) 
) 
)>newfile.txt 

GOTO :EOF 

:REPLACE 
SET /a newvalue=%1+1 
ECHO(opened: %newvalue% 
GOTO :eof 

Я использовал файл с именем q28585447.txt, содержащий данные для моего тестирования.

Производит newfile.txt Чтобы заменить файл, используйте move /y newfile.txt q28585447.txt (после изменения на протяжении вашего файла, конечно.

Просто, он читает каждую строку из файла данных %%a затем tokenises %%a с использованием разделителей по умолчанию в %%q и %%r Если %%q является целевой строкой, то %%r содержит значение, которое увеличивается на единице, в противном случае рвоты линии в %%a.

подпрограммы :replace simlpy добавляют 1 к параметру, передаваемому и реконструкции s - целевая линия.

Окружая весь цикл for...%%a в круглых скобках и перенаправляя файл, весь вывод echo ed перенаправляется на этот файл.

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