Чтение и запись целых чисел в текстовый файл с помощью пакетного скрипта - PullRequest
0 голосов
/ 05 июня 2018

У меня есть следующий пакетный скрипт:

@echo off
if exist test.txt (
    set /p foo=<test.txt
    echo "read: %foo%"
    set /A foo=foo+1
    (echo %foo%)>test.txt
    echo "wrote: %foo%"
) else (
    (echo 1)>test.txt
)

Я ожидаю, что скрипт проверит наличие файла test.txt.Если файл не существует, сценарий должен записать 1 в файл.Если файл существует, скрипт должен прочитать значение из файла, увеличить его на единицу, а затем записать обратно увеличенный файл.

Я ожидаю, что мой вывод будет выглядеть примерно так:

C:\opt>test.bat

C:\opt>test.bat
"read: 1"
"wrote: 2"

C:\opt>test.bat
"read: 2"
"wrote: 3"

C:\opt>test.bat
"read: 3"
"wrote: 4"

Однако вместо этого я получаю следующий вывод:

C:\opt>test.bat

C:\opt>test.bat
"read: 2"
"wrote: 2"

C:\opt>test.bat
"read: 2"
"wrote: 2"

C:\opt>test.bat
"read: 3"
"wrote: 3"

C:\opt>test.bat
"read: 3"
"wrote: 3"

C:\opt>test.bat
"read: 4"
"wrote: 4"

C:\opt>test.bat
"read: 4"
"wrote: 4"

Почему переменная foo не отображается с приращением, как ожидалось?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Ваш код может быть упрощен.

Если вы сначала установите переменную в ноль, а затем прочитаете текстовый файл с SET /P и перенаправлением, он перезапишет переменную.В это время вы можете добавить 1 к нему независимо от того, в каком состоянии находится переменная.

@echo off
set "foo=0"
IF exist "test.txt" set /p foo=<test.txt
echo read: %foo%
set /A "foo+=1"
echo wrote: %foo%
>test.txt echo %foo%

Вы даже можете избавиться от IF EXIST и просто перенаправить ошибку в nul, когда файл не существует.

@echo off
set "foo=0"
(set /p foo=<test.txt)2>nul
echo read: %foo%
set /A "foo+=1"
echo wrote: %foo%
>test.txt echo %foo%
0 голосов
/ 05 июня 2018

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

@echo off
setlocal enabledelayedexpansion
if exist test.txt (
    set /p foo=<test.txt
    echo "read: !foo!"
    set /A foo=foo+1
    (echo !foo!)>test.txt
    echo "wrote: !foo!"
) else (
    (echo 1)>test.txt
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...