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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Cepreu^, 9 фев 2016.

  1. Cepreu^
    Оффлайн

    Cepreu^ Новый пользователь

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

    Код (DOS):
    @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 КБ
      Просмотров:
      3
    • text.txt
      Размер файла:
      3 байт
      Просмотров:
      1
    Последнее редактирование модератором: 9 фев 2016
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Здравствуйте, Cepreu^ !

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

    Так Вам год создания или модификации файла интересует (или без разницы) ?

    Я бы оформил все отдельной подпрограммой.
    Код (DOS):
    @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
     
    Последнее редактирование: 9 фев 2016
    Kиpилл нравится это.
  3. Cepreu^
    Оффлайн

    Cepreu^ Новый пользователь

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

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

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

    Как бы это иcправить ?
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.476
    Симпатии:
    4.305
    Литература по батникам
    По некоторым отдельным темам и командам есть мои статьи. Спрашивайте. В принципе все есть в корне этого раздела (темы с пометкой "Статья").
    Хорошо. Давайте посмотрим конкретно по Вашему коду.
    Я принципиально писал новый, т.к. в Вашем много лишнего + и ошибки.

    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%.
    Если желаете сохранить значение и вывести его за пределы цикла, нужно писать, например:
    Код (Text):
    set i=%%i
    Вообщем, Ваш основной враг - лишние пробелы.
    Для анализа ошибок и их устранения всегда пользуйтесь кавычками, к примеру: echo i ravno "%%i" - Вам сразу бы показало, что имеется лишний пробел.
    Сравнение делается аналогично: if "%%i"=="2016" (

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

    Выполните такой код и посмотрите, что будет в файле:
    Код (Text):
    echo hello>temp3.txt world
    Вообщем, немного облагородил Ваш вариант. Поизучайте:
    Код (DOS):

    @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
    Последнее редактирование модератором: 10 фев 2016
    Kиpилл нравится это.
  5. Cepreu^
    Оффлайн

    Cepreu^ Новый пользователь

    Сообщения:
    3
    Симпатии:
    0
    Спасибо за лит-ру и статьи ! :Thank You:

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

Поделиться этой страницей