Работа с переменными в CMD

Cepreu^

Активный пользователь
Сообщения
3
Реакции
0
Баллы
181
Здравствуйте, помогите разобраться.
Написал простой батник test.bat. В результате которого выделяется год создания файла text.txt.
Код работает, результат правильный. Но результат получается в виде файла temp3.tmp.
А есть необходимость использовать результат в самом коде. В общем в коде есть цикл в котором переменной %i присваивается год создания файла ( равен 2016 ). В этом же цикле сразу распечатываю значение этой переменной ( block0 ) и получаю естественно 2016. А вот дальше в этом же цикле сразу пытаюсь использовать эту переменную в условии IF %i == 2016 ( block1 ), и получаю %i не равно 2016. В общем не могу понять почему это происходит. Да и дальше в коде распечатываю значение этой переменной ( block2 , block3 ) и уже не получаю 2016, а надо получить. Как быть ? Подскажите пожалуйста.

CMD/BATCH:
@echo off

for /r %%a in (text.txt) do (
  if  exist  %%a (
 
    rem  получение  даты  изменения  файла
 
    echo %%~ta > temp.tmp
    for /f "tokens=1 delims= " %%h in (temp.tmp) do (
      echo %%h > temp2.tmp
    )   
 
    rem  получение  года  создания  файла
 
    for /f "tokens=3 delims=." %%i in (temp2.tmp) do (
      echo %%i > temp3.tmp
     
rem --------------------------------------block0---------------------------------------     
      echo i ravno %%i
rem --------------------------------------block0---------------------------------------     


rem --------------------------------------block1---------------------------------------     
      if %%i == 2016 (
        echo i ravno 2016
      ) else ( echo i NE ravno 2016 ) 
rem --------------------------------------block1---------------------------------------     

    )

rem --------------------------------------block2---------------------------------------     
    echo i ravno %%i
rem --------------------------------------block2---------------------------------------     

  ) else ( echo file do not exist )
)

rem --------------------------------------block3---------------------------------------     
echo i ravno %%i
rem --------------------------------------block3---------------------------------------     

echo on

pause
 

Вложения

  • test.txt
    1.4 KB · Просмотры: 3
  • text.txt
    3 байт · Просмотры: 1
Последнее редактирование модератором:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
Здравствуйте, Cepreu^ !

%%i == 2016
пробелы перед (и после) знака равенства также входят в состав значения.

выделяется год создания файла text.txt.
rem получение даты изменения файла
Так Вам год создания или модификации файла интересует (или без разницы) ?

Я бы оформил все отдельной подпрограммой.
CMD/BATCH:
@echo off
SetLocal EnableExtensions

call :GetModifYear test.txt Year

if "%Year%"=="2016" echo OK

pause>NUL
goto :eof


:GetModifYear [file] [var.rtn]

  for %%a in ("%~1") do for /f "tokens=3 delims=. " %%b in ("%%~ta") do set "%~2=%%b"

exit /B
 
Последнее редактирование:

Cepreu^

Активный пользователь
Сообщения
3
Реакции
0
Баллы
181
Спасибо за подпрогу, буду разбираться. :Thank You: Кстати , подскажите где найти подробную инфу по программированию в cmd или книжку какую , где разжёваны все нюансы по cmd ?

Год извлекается из даты изменения файла, поэтому да, интересует именно год изменения файла.

Да видите ли я уже пробовал и так if %%i==2016, и так if %%i ==2016, и уже так if "%i%"=="2016" , но результат тот же ( i NE ravno 2016 ). :Ireful1: И это несмотря на то, что непосредственно перед if , значение переменной в выводе echo равно 2016.

Как бы это иcправить ?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,612
Реакции
6,051
Баллы
808
Кстати , подскажите где найти подробную инфу по программированию в cmd
Литература по батникам
По некоторым отдельным темам и командам есть мои статьи. Спрашивайте. В принципе все есть в корне этого раздела (темы с пометкой "Статья").
Да видите ли я уже пробовал и так
Хорошо. Давайте посмотрим конкретно по Вашему коду.
Я принципиально писал новый, т.к. в Вашем много лишнего + и ошибки.

1. В начале пакетного файла я всегда пишу директиву: SetLocal EnableExtensions, т.к. на некоторых системах иногда бывает отключен расширенный режим, позволяющий использовать доп. ключи (такие как for /f, /r ...).
2. for /r %%a in (text.txt) do (
/r - это рекурсивное перечисление всех файлов text.txt во всех папках, начиная с текущей.
3. if exist %%a ( - там у Вас пару лишних пробелов. В любом случае такое лучше писать в кавычках:
if exist "%%a"
3.1. Смысл это писать нету. Т.к. перечисление файлов само по себе подразумевает, что такой файл существует.
Разбираемся дальше.
4. echo %%~ta > temp.tmp
Здесь Вы записываете в файл, к примеру такое 10.02.2016 16:55 с концевым пробелом.
5.
for /f "tokens=1 delims= " %%h in (temp.tmp) do (
for /f "tokens=3 delims=." %%i in (temp2.tmp) do (
Вы прописываете разбиение на токены в несколько этапов, хотя это можно было сделать все сразу, указав все интересующие разделители:
for /f "tokens=3 delims=. " %%i in (temp.tmp) do (

В строках № 19 и 25 Вы используете одинаковые фразы - echo i ravno 2016
При чём одна из них выводится всегда (если файл txst.txt существует), а у второй фразы - доп. условие. В итоге по выводу батника совершенно ничего не понятно и Вы сами себя запутываете.

Теперь попридираюсь на счет понятий. %%i - это переменная цикла. Она действительна только внутри конструкции цикла (там где начинается скобка после do до момента ее закрытия.)
Она не имеет никакого отношения к переменной процесса - %i%.
Если желаете сохранить значение и вывести его за пределы цикла, нужно писать, например:
Код:
set i=%%i
Вообщем, Ваш основной враг - лишние пробелы.
Для анализа ошибок и их устранения всегда пользуйтесь кавычками, к примеру: echo i ravno "%%i" - Вам сразу бы показало, что имеется лишний пробел.
Сравнение делается аналогично: if "%%i"=="2016" (

И вот здесь у Вас лишний пробел:
CMD/BATCH:
echo %%i > temp3.tmp
а именно - в самом конце.

Выполните такой код и посмотрите, что будет в файле:
Код:
echo hello>temp3.txt world

Вообщем, немного облагородил Ваш вариант. Поизучайте:
CMD/BATCH:
@echo off
SetLocal EnableExtensions

for /r %%a in (text.txt) do (
  if exist "%%a" (
    rem  получение  даты  изменения  файла
    echo %%~ta> temp.tmp

    for /f "tokens=1 delims= " %%h in (temp.tmp) do (
      echo %%h> temp2.tmp
    )

    rem  получение  года  создания  файла

    for /f "tokens=3 delims=." %%i in (temp2.tmp) do (

      echo "%%i"> temp3.tmp
      echo %%%% i=="%%i"

      set i=%%i

      if "%%i"=="2016" (
        echo 2016 - OK
      ) else (
        echo 2016 - FAIL
      )
    )
  ) else (
    echo file does not exist
  )
)

echo %%i==%i%

pause>NUL
 

Вложения

  • test2.txt
    685 байт · Просмотры: 0
Последнее редактирование модератором:

Cepreu^

Активный пользователь
Сообщения
3
Реакции
0
Баллы
181
Спасибо за лит-ру и статьи ! :Thank You:

В остальном буду разбираться. Спасибо Вам за помощь.
 
Сверху Снизу