Windows cmd for files in directory

How can I iterate over each file in a directory using a for loop?

And how could I tell if a certain entry is a directory or if it’s just a file?

Peter Mortensen's user avatar

asked Sep 26, 2008 at 9:42

Vhaerun's user avatar

3

This lists all the files (and only the files) in the current directory and its subdirectories recursively:

for /r %i in (*) do echo %i

Also if you run that command in a batch file you need to double the % signs.

for /r %%i in (*) do echo %%i

(thanks @agnul)

Sam Sirry's user avatar

answered Sep 26, 2008 at 9:56

jop's user avatar

jopjop

82.9k10 gold badges56 silver badges52 bronze badges

8

Iterate through…

  • …files in current dir: for %f in (.\*) do @echo %f
  • …subdirs in current dir: for /D %s in (.\*) do @echo %s
  • …files in current and all subdirs: for /R %f in (.\*) do @echo %f
  • …subdirs in current and all subdirs: for /R /D %s in (.\*) do @echo %s

Unfortunately I did not find any way to iterate over files and subdirs at the same time.

Just use cygwin with its bash for much more functionality.

Apart from this: Did you notice, that the buildin help of MS Windows is a great resource for descriptions of cmd’s command line syntax?

Also have a look here: http://technet.microsoft.com/en-us/library/bb490890.aspx

CharlesB's user avatar

CharlesB

86.7k28 gold badges195 silver badges219 bronze badges

answered Sep 26, 2008 at 10:05

Marco's user avatar

MarcoMarco

2,7831 gold badge14 silver badges8 bronze badges

3

To iterate over each file a for loop will work:

for %%f in (directory\path\*) do ( something_here )

In my case I also wanted the file content, name, etc.

This lead to a few issues and I thought my use case might help. Here is a loop that reads info from each ‘.txt’ file in a directory and allows you do do something with it (setx for instance).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

*Limitation: val<=%%f will only get the first line of the file.

answered May 10, 2016 at 13:54

Aaron Votre's user avatar

Aaron VotreAaron Votre

1,6301 gold badge13 silver badges8 bronze badges

5

There is a subtle difference between running FOR from the command line and from a batch file. In a batch file, you need to put two % characters in front of each variable reference.

From a command line:

FOR %i IN (*) DO ECHO %i

From a batch file:

FOR %%i IN (*) DO ECHO %%i

answered Sep 26, 2008 at 11:52

aphoria's user avatar

aphoriaaphoria

19.8k8 gold badges64 silver badges73 bronze badges

0

This for-loop will list all files in a directory.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

«delims=» is useful to show long filenames with spaces in it….

‘/b» show only names, not size dates etc..

Some things to know about dir’s /a argument.

  • Any use of «/a» would list everything, including hidden and system attributes.
  • «/ad» would only show subdirectories, including hidden and system ones.
  • «/a-d» argument eliminates content with ‘D’irectory attribute.
  • «/a-d-h-s» will show everything, but entries with ‘D’irectory, ‘H’idden ‘S’ystem attribute.

If you use this on the commandline, remove a «%».

Hope this helps.

answered Jul 7, 2009 at 13:02

Jay's user avatar

JayJay

1,63516 silver badges14 bronze badges

0

%1 refers to the first argument passed in and can’t be used in an iterator.

Try this:

@echo off
for %%i in (*.*) do echo %%i

answered Sep 26, 2008 at 9:52

Sam Meldrum's user avatar

Sam MeldrumSam Meldrum

13.8k6 gold badges34 silver badges40 bronze badges

1

To iterate through all files and folders you can use

for /F "delims=" %%a in ('dir /b /s') do echo %%a

To iterate through all folders only not with files, then you can use

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

Where /s will give all results throughout the directory tree in unlimited depth. You can skip /s if you want to iterate through the content of that folder not their sub folder

Implementing search in iteration

To iterate through a particular named files and folders you can search for the name and iterate using for loop

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

To iterate through a particular named folders/directories and not files, then use /AD in the same command

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

answered Feb 28, 2019 at 12:09

jafarbtech's user avatar

jafarbtechjafarbtech

6,8821 gold badge37 silver badges56 bronze badges

3

I had trouble getting jop’s answer to work with an absolute path until I found this reference: https://ss64.com/nt/for_r.html

The following example loops through all files in a directory given by the absolute path.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)

answered Jun 25, 2019 at 20:35

datchung's user avatar

datchungdatchung

3,9081 gold badge28 silver badges30 bronze badges

1

Here’s my go with comments in the code.

I’m just brushing up by biatch skills so forgive any blatant errors.

I tried to write an all in one solution as best I can with a little modification where the user requires it.

Some important notes: Just change the variable recursive to FALSE if you only want the root directories files and folders processed. Otherwise, it goes through all folders and files.

C&C most welcome…

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls

answered Jan 24, 2020 at 22:29

Ste's user avatar

SteSte

1,7791 gold badge19 silver badges27 bronze badges

for %1 in (*.*) do echo %1

Try «HELP FOR» in cmd for a full guide

This is the guide for XP commands. http://www.ss64.com/nt/

answered Sep 26, 2008 at 9:48

Axeman's user avatar

AxemanAxeman

3491 silver badge7 bronze badges

0

The following code creates a file Named «AllFilesInCurrentDirectorylist.txt» in the current Directory, which contains the list of all files (Only Files) in the current Directory. Check it out

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

answered Sep 28, 2010 at 9:21

Ankur's user avatar

AnkurAnkur

1,26818 silver badges22 bronze badges

I use the xcopy command with the /L option to get the file names. So if you want to get either a directory or all the files in the subdirectory you could do something like this:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

I just use the c:\ as the destination because it always exists on windows systems and it is not copying so it does not matter. if you want the subdirectories too just use /s option on the end. You can also use the other switches of xcopy if you need them for other reasons.

competent_tech's user avatar

answered Dec 29, 2012 at 19:27

Knoots's user avatar

It could also use the forfiles command:

forfiles /s 

and also check if it is a directory

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

Peter Mortensen's user avatar

answered Sep 11, 2014 at 14:41

Max's user avatar

MaxMax

4544 silver badges10 bronze badges

1

I would use vbscript (Windows Scripting Host), because in batch I’m sure you cannot tell that a name is a file or a directory.

In vbs, it can be something like this:

Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")

Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)

Dim files
Set files = mainFolder.Files

For Each file in files
...
Next

Dim subFolders
Set subFolders = mainFolder.SubFolders

For Each folder in subFolders
...
Next

Check FileSystemObject on MSDN.

answered Sep 26, 2008 at 9:56

Biri's user avatar

BiriBiri

7,1117 gold badges38 silver badges52 bronze badges

4

Try this to test if a file is a directory:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

This only will tell you whether a file is NOT a directory, which will also be true if the file doesn’t exist, so be sure to check for that first if you need to. The carets (^) are used to escape the redirect symbols and the file listing output is redirected to NUL to prevent it from being displayed, while the DIR listing’s error output is redirected to the output so you can test against DIR’s message «File Not Found».

Peter Mortensen's user avatar

answered Jan 4, 2011 at 17:55

sugerfunk's user avatar

0

try this:

::Example directory
set SetupDir=C:\Users

::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable 
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1

echo there are %counter% files in your folder

it counts .msi and .exe files in your directory (and in the sub directory). So it also makes the difference between folders and files as executables.

Just add an extension (.pptx .docx ..) if you need to filter other files in the loop

answered Dec 2, 2016 at 10:38

Littlepony's user avatar

In my case I had to delete all the files and folders underneath a temp folder. So this is how I ended up doing it. I had to run two loops one for file and one for folders. If files or folders have spaces in their names then you have to use » «

cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)

answered Sep 26, 2018 at 17:54

Sam B's user avatar

Sam BSam B

27.3k15 gold badges84 silver badges121 bronze badges

I’m assuming this is fairly easy to do, but I have zero experience with Windows’s command line utilities. Basically, I need to iterate over all files in a directory (great if it can do sub-directories, but I can run it on each of the 5 directories if need be), get the name as a variable, and have it run

"C:\Program Files\ImageMagick-6.7.6-Q16\convert.exe" -compress LZW 
   -colorspace Gray -colors 32 file_var file_var

I saw Dynamically name files in a command prompt for loop. Would I be able to use that (swapping the SET… with the above command)? The space on the computer in question is beyond limited so I can’t perform a backup prior to running this at this stage (bad, I know).

Community's user avatar

asked May 14, 2012 at 3:03

Robert's user avatar

3

Weird, there was a response that had the recursive part.

Well, per How to Loop Through Files Matching Wildcard in Batch File, I was able to achieve this. Here is how it was performed:

 cd path_to_root
 for /R %%f in (*.tif) do (
 "C:\Program Files\ImageMagick-6.7.6-Q16\convert.exe" -compress LZW 
    -colorspace Gray -colors 32 "%%f" "%%f"
 )

Community's user avatar

answered Mar 4, 2013 at 14:21

Robert's user avatar

RobertRobert

5311 gold badge5 silver badges16 bronze badges

1

Open PowerShell

$files = Get-ChildItem -Recurse 
foreach ($file in $files){
    c:\windows\System32\notepad.exe $file.FullName
}

Get-ChildItem retrieves a list of files as objects from the current subdirectory. «-recurse» will include sub-directories. This places it into an array $Files.

The foreach loop cycles through each file and calls notepad with the commandline argument of the full file-name path to each file.

CAUTION: Test the above code in a directory with a few small text files, as it will open up an instance of Notepad for each file.

That should give you an idea of how to go about what you’re looking to do.

answered Mar 2, 2013 at 21:45

Bye's user avatar

ByeBye

3611 gold badge3 silver badges8 bronze badges

0

I had a similar task — to remove last 3 pages from each pdf in a dir from the cmd

for %f in (*.pdf) do ( qpdf "%f" --pages . 1-r4 -- --replace-input)

answered Jun 6 at 14:54

user2078583's user avatar

0

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

Learn how to use for command to iterate over a list of items and run commands on each of them. We can run a command for each file in a directory, for example.

The simplest form of for command is:

for %i in (set) do command command-arguments

Here set means the list of variants for which the command needs to be run. I’m not listing the for loop’s full options here as same can be found by running the command ‘for /? ‘.   I have explained below with examples as to how to use for loop in different use cases.

Run command for each file

You want to run an application/command on selective files in a directory. You can use for command for this use case as below.

for /F %i in ('command to get files list') do command %i

For example, you want to open all the log files using notepad application.

for /F %i in ('dir /b *.log') do notepad %i

Here dir /b *.log retrieves the list of all log files. For command iterates over the list and then opens them in notepad.

Run command for each user

You have a list of login names whose accounts need to be deleted from the system. Let’s say the user names are user1, user2, user3, user4, user5, user6. To delete all these user accounts in a single step we can run the below command.

for %i in (user1 user2 user3 user4 user5 user6) do net user /delete %i

If the list of user accounts is stored in a file then we can delete the accounts using the below command.

for /F %i in (filename) do net user /delete %i

Similarly, we can add new user accounts in batch using for command.

Select columns from a text file (Similar to Linux ‘cut’ command)

If you have a text file with multiple columns, and if you want to filter out certain unwanted columns from the file, you can do it using for command easily.
Let’s say my file has 4 columns separated with space as below.

abcd efgh ijkl mnop
qrst uvwx yz1 adef
efsa erafa afaf affaf
....

Now to print only the columns 2 and 4, I can use the below command.

 for /F "tokens=2,4" %i in (test.txt) do @echo %i %j

You can redirect the output from the above command to a new text file using the operator pipe(‘|’)

If the file is separated with with comma(‘,’), as in CSV files, we can use the below command.

for /F "tokens=2,4 delims=," %i in (test.txt) do @echo %i %j

If you want to retain the comma(,) between the columns, you can add it as below.

for /F "tokens=2,4 delims=," %i in (test.txt) do @echo %i,%j

На чтение 6 мин Просмотров 5.8к. Опубликовано

В этой статье мы рассмотрим, как использовать конструкцию for в командной строке для перебора значений и файлов. Все примеры в статье я буду приводить с учетом, что код будет выполнятся в теле сценария, который, в свою очередь будет запускаться из консоли командной строки.

Лично я, сперва добавляю в переменную окружения PATH путь к каталогу, в котором находится сценарий:

set%PATH%;путь_к _каталогу

После этого я просто ввожу в консольном окне имя сценария, например, test.bat. Помните, что путь будет храниться в переменной окружения лишь в пределах текущего окна командной строки.

Командная строка for – перебор значений

Для перебора значений используется следующий синтаксис:

for /L %%переменная in (начало, шаг, конец) do (оператор)

Ключ /L говорит о том, что происходит перебор данных, далее следует имя переменной, в которую эти данные будут записываться. В круглых скобках нужно через запятую указать три параметра:

  • начало – начальное значение
  • шаг – тут мы указывает, насколько нужно увеличивать или уменьшать начальное значение при каждой итерации. То есть, если параметр содержит отрицательное число, то будет происходить уменьшение, иначе – увеличение параметра “начало”.
  • конец – тут нужно указать конечное значение, именно оно и будет определять, завершать цикл или нет. То есть, при каждой итерации происходит сравнивание начального и конечного параметра.

Давайте рассмотрим такой пример:

@echo off
for /L %%B in (0,1,5) do echo %%B
echo.
for /L %%B in (5,-1,0) do echo %%B

В данном сценарии используются два цикла for командной строки, первый задает диапазон цифр от 0 до 5 с шагом 1, второй – диапазон цифр от 5 до 0 с шагом -1. То есть, прямой и обратный порядок. Функция ЭХО будет в виде списка выводить содержимое переменной B. Команда “echo.” вставляем между списками пустую строку.

Теперь попробуем найти сумму чисел от 0 до 100:

@echo off
set summ=0 
for /L %%B in (0,1,100) do set/A summ+=%%B
echo %summ%
set summ=

Сначала мы отключаем вывод эхо-отображений. Потом мы объявляем переменную summ с помощью ключевого слова set и присваиваем ей ноль. Далее в цикле for задаем начальное значение в 0, шаг в 1 и конечное значение в 100.  Суммирование происходит в строке set/A summ+=%%B, тут к содержимому переменной summ будет добавляться содержимое переменной %%B. В конце мы выводим конечный результат и удаляем из окружения summ.

Теперь давайте посмотрим, как будет выглядеть код для нахождения факториала числа 5:

@echo off
set fact=1
for /L %%B in (5,-1,1) do set/A fact*=%%B
echo %fact%
set fact=

Тут практически тот же самый синтаксис, за исключением того, что мы задали отрицательный шаг и использовали оператор *=.

Хорошо, теперь усложним задачу: найдем сумму чисел от 0 до 10, исключив из расчета числа 5, 7 и 9:

@echo off
set summ=0
for /L %%B in (0,1,10) do (if "%%B" neq "5"(if "%%B" neq "7"(if "%%B" neq "9" set/A summ+=%%B)))
echo%summ%
set summ=

Как видим, для проверки условия мы использовали условный оператор if. К сожалению, в командной строке нет логических операторов тип “ИЛИ” и “И”, как например, в языках vbscript и jscript, поэтому нам пришлось создавать вложенные операторы if. В результате, мы получили число 34. Также обратите внимание на оператор “neq” – проверка условия типа “НЕ РАВНО”.

Командная строка for – работа с файлами

Для групповой работы с файлами используется следующий синтаксис цикла for командной строки:

for %переменная in (набор_файлов) do (оператор)

Базовый параметр тут переменная набор_файлов, которая может содержать:

  • отдельный файл, например, my_file.txt
  • групповой набор документов, заданный через шаблон, например, *.txt
  • список файлов, который разделяется пробелами, причем каждый элемент списка тоже может содержать шаблон, например, my_file.txt *.doc my*.avi

Стоит учитывать тот факт, что если не указывать путь к файлу, то поиск будет производиться в текущем каталоге – в том каталоге, из которого производится запуск сценария.

В следующем примере происходит вывод всех файлов из каталога d:work с расширением .txt:

@echo off
for %%В in (d:\work\*.txt) do (echo%%В)

Тут B является переменной инициализации, при каждой итерации ей будет присвоено путь, имя и расширение найденного текстового документа, а функция ЭХО сразу выведет информацию на экран. Потом снова, переменной B будет присвоено новое имя и снова произойдет вывод данных. Сам цикл работает до тех пор, пока не будут найдены все значения, заданные в условии.

Естественно, можно задать условие для вывода всех файлов с расширениями, например, .txt, .avi и .pdf.

@echo off
set work_dir=d:\work\ 
for %%B in (%work_dir%\*.txt %work_dir%\*.avi %work_dir%\*.pdf) do (echo %%B)
set work_dir=

В данном случае переменная work_dir содержит путь к папке d:work, в цикле командной строки for мы добавляем к переменной нужные расширения. В конце сценария происходит удаление переменной work_dir.

Также стоит понимать, что вместо одного оператора (в данном случае эхо) можно прописать несколько, сгруппировав их символом &. То есть, данный цикл позволяет в групповом порядке обработать одним махом несколько файлов. Только не забывайте, что при формировании группы их стоит заключить в круглые скобки. Например:

Можно попробовать получить список имен файлов и их размер:

@echo off
for %%B in (%SystemRoot%\*.txt) do (echo %%B %%~zB)

Конструкция ~z позволяет получить размер файла в байтах.

Что бы использовать сразу цикл в командной строке, стоит вместо двух символов % прописывать один, например:

for %B in (%SystemRoot%\*.txt) do (echo %B %%~zB)

04.02.2013, 00:56. Показов 364342. Ответов 16


Студворк — интернет-сервис помощи студентам

Вдохновившись сообщением от FraidZZ, написал мини-статейку, основанную на изложенных им положениях.

Заметки

Циклическиe операции FOR

Командой FOR задаётся список команд, которые выполняются с КАЖДЫМ элементом набора.
Набор* пишется внутри IN (…)
Список команд пишется внутри DO (…)
Командная строка выполняет эти команды раз за разом, при этом текущий элемент набора находится в переменной, заданной после %% (назовём ее переменной цикла).

Например,

Windows Batch file
1
FOR %%a IN (C:\Users\*.txt) DO echo %%a

выведет имена и путь ко всем файлам с расширением .txt в папке C:\Users.

* Примеры под спойлером

Виды наборов для FOR

Для команды For без ключей набором может являться:

1) Маска файлов* (или путь + маска файлов)
— в двойных кавычках, или без них:

IN (*.txt)
Результат: список файлов с расширением .txt в текущем каталоге.

IN (*.txt *.bat)
Результат: список файлов с расширениеми .txt и .bat в текущем каталоге.

IN («C:\Folder 1\Doc_31-12-*.txt»)
Результат: тот же. Но поиск ведется в каталоге C:\Folder 1 (заметьте с пробелом в имени);
имя файла начинается на Doc_31-12-

Прим.: FOR без ключа не умеет выводить список каталогов.
* маска файлов — это набор файлов, заданный с помощью подстановочных знаков * и/или ?
где * — обозначает 0 или больше любых символов в имени файла.
а ? — означает 0 или 1 любой символ в имени файла.

2) Строка
— в двойных кавычках, или без них:

Строкой считается любая последовательность символов, если она не содержит знаков маски * или ?
Смысл цикла здесь в том, чтобы разбить такую строку по пробелам (или знакам табуляции)
и выполнить с каждой подстрокой список команд.

Windows Batch file
1
FOR %%a IN (гитара рыбка) do echo Моя %%a

Результат:

Если мы хотим, чтобы какая-то из строк не «билась» по пробелам, укажем ее в двойных кавычках:

Windows Batch file
1
FOR %%a IN (гитара "дорогая рыбка") do echo Моя %%~a

Результат:

Моя гитара
Моя дорогая рыбка

При этом, чтобы не выводились сами кавычки «» мы используем модификатор* ~ (тильда) при раскрытии переменной цикла %%~a

*О других модификаторах переменной цикла можно почитать здесь и здесь.

Не по теме:

3) еще есть смешанный тип. Это когда в наборе стоит маска (1-й описанный тип), а через пробел Строка (2 тип)… ведет себя вполне ожидаемо, но вряд ли найдет себе применение.

О наборах для FOR с ключем /F далее в нижнем спойлере.

Ключ /F часто используется для построчного разбора файла, т.е.

Windows Batch file
1
FOR /f "usebackq delims=" %%a IN ("C:\1.txt") DO echo %%a

выведет все строки файла 1.txt, который находится в корне диска C.

UseBackQ (Use back quotes) означает, что набор с двойными кавычками* подразумевает передачу в цикл имени файла.

delims= означает, что в переменную %%a будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).
В такой вариации:
tokens=* приводит к тому же результату, что и delims=. Означает прекратить разбивку по разделителю после «0-го» токена, т.е. сразу же.

* Этот вариант необходим для работы с файлом, путь или имя которого содержит пробелы.
Можно было не использовать UseBackQ, тогда команда приняла бы вид:

Windows Batch file
1
FOR /f "tokens=" %%a IN (C:\1.txt) DO echo %%a

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

** Примеры под спойлером

Виды наборов для FOR /F

В цикле FOR /F вид задаваемого набора зависит от формы кавычек в IN (…), а также наличия ключевого слова UseBackQ

Виды наборов для FOR /F:
1) Набор файлов (задание маски недопустимо!)

без UseBackQ — задается без кавычек IN (…)

__с UseBackQ — может задаваться как в кавычках так и без них. IN (…) IN («…»)

Специфика работы


Функционал:

чтение содержимого файла(ов) построчно в переменную цикла!

Принцип работы:

источником для разбиения по разделителю (delims) является содержимое файла, заданного внутри IN (…) или файлов, если они заданы через пробел.

Исключение:

принятый по-умолчанию разделитель (пробел и знак табуляции) для этой конструкции цикла не применяется.

А что получится, если установить delims= (возле равно — знак пробела) ?

Windows Batch file
1
FOR /F "delims= " %%a in (1.txt) do echo %%a

В выводе на экран командой Echo %%a мы получим содержимое файла, где каждая из строк будет напечатана до первого встретившегося пробела.
.

2) Строка (допускаются практически любые символы)

без UseBackQ — задается с двойными кавычками IN («…»)

__с UseBackQ — задается с одиночными прямыми кавычками IN (‘…’)

3) Команда (сначала выполняется она, а уже ее результаты обрабатываются циклом как строка(-и))

без UseBackQ — задается с одиночными прямыми кавычками IN (‘…’)

__с UseBackQ — задается с одиночными обратными кавычками IN (`…`)

Примеры:

1.1. Чтение файла — Набор файлов

Windows Batch file
1
FOR /F %%a IN (c:\users\1.txt c:\users\2.txt) do echo.%%a

Результат: выведет подряд содержимое двух файлов — 1.txt и 2.txt из каталога c:\users
Прим.: Echo. — с точкой — это обход ошибки, чтобы можно было напечатать пустую строку, точнее строку с пробелами.

1.2. Чтение файла — Набор файлов + UseBackQ
Получаем возможность использовать пробелы.

Windows Batch file
1
FOR /F "usebackq" %%a IN ("c:\folder 1\1.txt") do echo.%%a

Результат: выведет содержимое файла 1.txt из каталога c:\folder 1
(заметьте, в имени папки есть пробел).

2.1. Строка

Windows Batch file
1
FOR /F %%a in ("Каждое слово в отдельную переменную") DO echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e

Цитата
Сообщение от Результат

a=Каждое; b=слово; c=в; d=отдельную; e=переменную

2.2. Строка + UseBackQ

Windows Batch file
1
FOR /F "UseBackQ" %%a in ('Каждое слово в отдельную переменную') DO echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e

Результат такой же.

3.1. Команда

Windows Batch file
1
For /F "tokens=1-4" %%a IN ('Dir /A:D-L') Do Echo Папка %%d Дата модификации %%a. Время %%b

Сначала выполняется Dir /AD-L, которая выводит информацию о папках в текущем каталоге.
Вот что попадает под разбор циклу:

Далее цикл разбирает каждую строку по пробелам и табуляции на подстроки (токены).
На примере 1-й строки:
1-й токен (%%a)=29.12.2012 …2-й токен (%%b)=15:16 …3-й токен (%%c)=<DIR> …4-й токен (%%d)=Favorites

Результат через Echo выводится на экран:

Папка Favorites Дата модификации 29.12.2012. Время 15:16
Папка Links Дата модификации 14.01.2013. Время 01:51
…и т.д.

3.2. Команда + UseBackQ

Windows Batch file
1
For /F "Usebackq tokens=1-4" %%a IN (`Dir /A:D-L`) Do Echo Папка %%d Дата модификации %%a. Время %%b

Результат такой же.
Альтернативный вариант нужен с целью, если одна из выполняемых команд требует точно такие же кавычки как и ключевое слово IN (…).
Дабы не пользоваться символом экранирования, просто применяем другие кавычки.

Отличительной особенностью FOR /F является умение работать через токены*,
а также поддержка дополнительных ключевых слов:
1) eol — знак комментария в начале строки (1-й символ). Т.е. строки с таким символом не будут обрабатываться. (по умолчанию, знак точки с запятой ; )
2) skip — пропуск определенного кол-ва обрабатываемых строк от начала файла
3) delims — задать другой разделитель(-ли) (по умолчанию, пробел и знак табуляции)
4) tokens — количество получаемых токенов (подстрок) в теле цикла и пределы разбивки по разделителю.
Также можно задать конкретный № токена, который попадет в первую переменную цикла.
5) usebackq — изменение правил использования кавычек внутри IN (…)

Детальную справку можно получить, введя в консоль команду FOR /?

* Токены — это подстроки, которые попадают в переменные цикла %% в каждой из итераций.
Они получаются в результате разбивки строки, заданной в IN (…), по разделителю, заданному в Delims= (по умолчанию, пробел и знак табуляции).

В отличие, от FOR без ключа, в FOR /F все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла.
Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке*, начиная с буквы, заданной после FOR /F %%

Т.е.

Windows Batch file
1
FOR /F "tokens=1,2" %%a IN ("гитара рыбка") do echo Моя %%a и моя %%b.

Результат:

Обратите внимание: по умолчанию, цикл выдаёт в результатах только 1-ый токен. Если вам нужно, получить другой, нужно явно указывать модификатор «tokens=xxx».

*

Макс. количество токенов и обход ограничения

Максимальное кол-во токенов составляет — 26,
если начальным указать %%a либо %%A (регистр имеет значение)
При этом переход с %%z в %%A не происходит. Остальная часть подстрок опускается.
Можно проверить:

Windows Batch file

For /F "tokens=1,2" %%z IN ("1 2") do echo %%A

Бывают случаи, когда требуется разбить строку по специфическому разделителю и при этом выполнить одну и ту же команду над каждой из подстрок (токеном). Кол-во токенов неизвестно.
Метод показал Anonymоus в теме Символ переноса строки в переменной окружения

Алгоритм заключается в замене разделителя на пробел с одновременным заключением каждого токена в двойные кавычки. Далее строка разбирается обычным циклом FOR без ключа.

Более универсальные конструкции на основе FOR /F для работы с файлами/папками строятся путем помещения
в IN (‘…’) команды, результаты от выполнения которой уж затем обрабатываются циклом.
Чаще всего это команда Dir.

А теперь рассмотрим более сложный пример:

1.2. Чтение файла (сложный пример).
Давайте возьмем сложный пример, и раскусим «крепкий орешек»

Windows Batch file
1
FOR /F "UseBackQ skip=1 tokens=2 delims=/\ eol=" %%X in ("%~dp01.txt") do echo %%X

Имеем в распоряжении файл 1.txt, который находится рядом с батником.

Цитата
Сообщение от Содержимое файла 1.txt

первая строка
;комментарий/кода
наше любимое\блюдо

Порядок разбора (или «как прибл. будет думать ком. строка»):
1) %~dp0 — означает каталог, где находится батник, например c:\temp\

2) UseBackQ, ага — значит если в IN (…) ничего нет или двойные кавычки, то это файл и его нужно прочесть.

3) Читаем содержимое файла 1.txt в папке %~dp0, а затем каждую его строку проверяем по правилам… ключевых слов skip=1 tokens=2 delims=/\ eol=

4) Итак, первая строка так и называется «первая строка»
skip=1 — означает пропустить от начала файла 1-у строку,
значит идем дальше:

5) Вторая строка: «;комментарий/кода»
Первый символ — это точка с запятой. А теперь смотрим сюда «eol=пустой символ».
По умолчанию eol=; и если бы мы не указали пустой EOL, то цикл просто бы пропустил эту строку.
Итак, символ комментария не совпадает с заданным (т.е. он вообще пустой), а значит строчка нам подходит -> проверяем ее дальше:

6) Смотрим какие приняты разделители: delims=/\ (знаки / и \ ), значит
из строки «;комментарий/кода»
мы получим 2 подстроки:
1-й токен — «;комментарий»
2-й токен — «кода»

7) Теперь смотрим сюда tokens=2 — значит, что первой букве цикла нужно присвоить значение 2-го токена.
Первая буква цикла у нас X. Переменная называется

%%X
А второй токен — это подстрока «кода»

8) Только теперь мы попадаем в тело цикла: Echo %%X
что означает — вывести на экран текст «кода»

С 3-ей строкой потренируйтесь самостоятельно.

Вот такой результат окажется на экране:

Ключ /L

Windows Batch file
1
FOR /L %%a IN (0,2,6) DO echo %%a

IN (первое, шаг, последнее)
означает математическое перечисление чисел от первого числа (0), до третьего (6), с шагом, указанным вторым числом (2) в наборе IN (…).

Указанная команда выведет:

Прим.: дробные числа командной строкой не поддерживаются.

Миниатюры

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



16



  • Windows cmd delete folder with files
  • Windows cmd show files in directory
  • Windows check port is busy
  • Windows cannot verify the digital signature for this file driver
  • Windows check disk on boot