Статья – [CMD] Циклические операции и примеры (команда FOR) | SafeZone

Статья – [cmd] циклические операции и примеры (команда for)

Продолжение…

Особенности, которые распространяются на циклы FOR

0) Если нужно записать в наборе несколько команд, то используем:

а) знаки амперсанда &, если мы хотим записать все в одну строку:

б) знаки скобок, если хотим разбить команды в несколько строк для наглядности и удобства:

1) Пустые строки в содержимом файлов и выводе команд игнорируются.

2) Если предполагается получение пустого токена, остальные токены смещаются.
К примеру,
имеем файл с содержимым:

file.txt написал(а):

Применим команду:

Результат будет:

cmd написал(а):

вместо ожидаемого

cmd написал(а):

3) Все специальные (служебные) символы необходимо экранировать (предварять птичкой ^).

Это такие символы, как | = ^ < > &. А также % ! – если они используются не для раскрытия переменной, кроме случая с !, когда не включено удаленное расширение переменных.

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

4) Регистр переменной цикла имеет значение.

5) Изменить вручную значение переменной цикла нельзя. Например, set %%A=param не даст эффекта.

6) После выхода из цикла переменная цикла уничтожается.

7) Внутри цикла можно использовать не более 1-го комментария вида :: (иначе, будет критическая ошибка и “вылет” из пакетного файла)
Вместо этого используем Rem.

8) Внутри цикла можно использовать не более 1-й метки (иначе, будет такой же “вылет”).

Пример максимально допустимой конструкции:

9) Тем не менее из цикла можно безвозвратно выйти на метку Goto metka

а также выйти в подпрограмму и вернутся снова в цикл точно в ту же позицию через команду Call :metka

В конце подпрограммы должна стоять команда

Exit /B

:/>  Установка и удаление программ в windows 8 где находится

10) Для получения значения обычной переменной внутри цикла в случае, если этой переменной было присвоено новое значение внутри тела этого же цикла, необходимо раскрывать переменную через знаки восклицания !variant! – это называется отложенное расширение переменных.
Перед использованием такого способа, его нужно включить, задав в начале пакетного файла команду:

Иначе, если использовать обычный способ раскрытия

%variant%

, мы получим значение переменной, присвоенное ей еще до входа в цикл.

Точно таким же образом (через ! ) необходимо раскрывать переменную времени внутри цикла, т.к. иначе для цикла время “замерзает”.

Происходит это потому, что в цикл попадает т.н. “слепок” переменных среды. И работа с ними через % происходит уже как с копией данных, а не актуальными значениями.

11) Когда после IN указана команда, под разбор цикла попадают такие потоки:
1-й поток (StdOut)
с 3-го по 9-й поток (User Stream)

При этом 2-й поток (StdError) отображается на экране сразу после выполнения указанной в цикле команды в IN (…)
2-й поток можно занулить, обычным способом, не забыв экран:

Также можно перенаправить 2-й поток, чтобы он обрабатывался вместе с первым, вместо его вывода на экран:

Собственно, чтобы наоборот, обрабатывать 2-й поток вместо первого, можно воспользоваться следующей конструкцией:

12) При запуске цикла из консоли (cmd.exe) переменные цикла нужно указывать без удвоения знака процента

%a

.

Это же правило касается вызова цикла через Shell-подобные команды на других языках программирования.

13) Переменную цикла нельзя раскрыть внутри строки модификаторов другого цикла:

но есть способ обхода от

ComSpec

:

§

Продолжение…

Особенности, которые распространяются на циклы FOR

0) Если нужно записать в наборе несколько команд, то используем:

а) знаки амперсанда &, если мы хотим записать все в одну строку:

:/>  Как узнать на сколько ватт блок питания в компьютере

б) знаки скобок, если хотим разбить команды в несколько строк для наглядности и удобства:

1) Пустые строки в содержимом файлов и выводе команд игнорируются.

2) Если предполагается получение пустого токена, остальные токены смещаются.
К примеру,
имеем файл с содержимым:

file.txt написал(а):

Применим команду:

Результат будет:

cmd написал(а):

вместо ожидаемого

cmd написал(а):

3) Все специальные (служебные) символы необходимо экранировать (предварять птичкой ^).

Это такие символы, как | = ^ < > &. А также % ! – если они используются не для раскрытия переменной, кроме случая с !, когда не включено удаленное расширение переменных.

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

4) Регистр переменной цикла имеет значение.

5) Изменить вручную значение переменной цикла нельзя. Например, set %%A=param не даст эффекта.

6) После выхода из цикла переменная цикла уничтожается.

7) Внутри цикла можно использовать не более 1-го комментария вида :: (иначе, будет критическая ошибка и “вылет” из пакетного файла)
Вместо этого используем Rem.

8) Внутри цикла можно использовать не более 1-й метки (иначе, будет такой же “вылет”).

Пример максимально допустимой конструкции:

9) Тем не менее из цикла можно безвозвратно выйти на метку Goto metka

а также выйти в подпрограмму и вернутся снова в цикл точно в ту же позицию через команду Call :metka

В конце подпрограммы должна стоять команда

Exit /B

10) Для получения значения обычной переменной внутри цикла в случае, если этой переменной было присвоено новое значение внутри тела этого же цикла, необходимо раскрывать переменную через знаки восклицания !variant! – это называется отложенное расширение переменных.
Перед использованием такого способа, его нужно включить, задав в начале пакетного файла команду:

:/>  Горячие клавиши Windows 10, которые необходимо знать

Иначе, если использовать обычный способ раскрытия

%variant%

, мы получим значение переменной, присвоенное ей еще до входа в цикл.

Точно таким же образом (через ! ) необходимо раскрывать переменную времени внутри цикла, т.к. иначе для цикла время “замерзает”.

Происходит это потому, что в цикл попадает т.н. “слепок” переменных среды. И работа с ними через % происходит уже как с копией данных, а не актуальными значениями.

11) Когда после IN указана команда, под разбор цикла попадают такие потоки:
1-й поток (StdOut)
с 3-го по 9-й поток (User Stream)

При этом 2-й поток (StdError) отображается на экране сразу после выполнения указанной в цикле команды в IN (…)
2-й поток можно занулить, обычным способом, не забыв экран:

Также можно перенаправить 2-й поток, чтобы он обрабатывался вместе с первым, вместо его вывода на экран:

Собственно, чтобы наоборот, обрабатывать 2-й поток вместо первого, можно воспользоваться следующей конструкцией:

12) При запуске цикла из консоли (cmd.exe) переменные цикла нужно указывать без удвоения знака процента

%a

.

Это же правило касается вызова цикла через Shell-подобные команды на других языках программирования.

13) Переменную цикла нельзя раскрыть внутри строки модификаторов другого цикла:

но есть способ обхода от

ComSpec

: