CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Ответить
 • Просмотры: 3
Аватара пользователя
alexys2004

CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение alexys2004 »

Здравия всем!

Уважаемые знатоки, требуется ваша помощь!

Есть стандартный цикл, который берёт из внешнего файла имена и записывает их в другой файл!

Пока этих файлов была пара, было терпимо, а теперь россыпь из десятка файлов начинает раздражать! Изображение

Возможно ли сделать так, чтобы цикл брал имена из списка внутри самого исполняемого CMD ?

Например, цикл обращается к некоему списку имён, который прячется в конце файла после EXIT и дальше записывает их во внешний файл..





PHP код:

Код: Выделить всё

SET NAME=:список
FOR /F "usebackq tokens=* delims=" %%i IN ("%NAME%") DO (ECHO %%i>> файл.txt)
EXIT

:список откуда брать имена
ИМЯ1
ИМЯ2
ИМЯ3 






Крайне благодарен, если есть решение!
Аватара пользователя
alexys2004

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение alexys2004 »

Не совсем список, но, работает:



Код:

Код: Выделить всё

@echo off
SetLocal EnableExtensions EnableDelayedExpansion
SET "len=5"
FOR /l %%i IN (1,1,%len%) DO (
call :NAME%%i
ECHO. !name! >> файл.txt
)
goto :EOF
exit
:NAME1
set "name=ИМЯ1"
goto :EOF
:NAME2
set "name=ИМЯ2"
goto :EOF
:NAME3
set "name=ИМЯ3"
goto :EOF
:NAME4
set "name=ИМЯ4"
goto :EOF
:NAME5
set "name=ИМЯ5"
goto :EOF

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

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение alexys2004 »

Такой вариант у меня уже был, очень трудно искать и редактировать список имён!



Что касается "временного файла" - тоже думал, но в крайнем случае.. проще, наверное, всю эту россыпь в архив собрать.



Нужен, если есть, именно вариант с обращением к голому списку внутри самого CMD ?
Аватара пользователя
alexys2004

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение alexys2004 »

Цитата alexys2004:



Что касается "временного файла" - тоже думал, но в крайнем случае.. проще, наверное, всю эту россыпь в архив собрать.
CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD




Никакой россыпи, например:



Код:

Код: Выделить всё

@echo off
SET "file_with_name=%temp%\file_with_name.txt"
more +9 "%~0">"%file_with_name%"
FOR /F "usebackq tokens=* delims=" %%i IN ("%file_with_name%") DO (ECHO %%i)
del /f /q "%file_with_name%"
EXIT
:список имён
ИМЯ1
ИМЯ2
ИМЯ33
ИМЯ4
ИМЯ5
Аватара пользователя
alexys2004

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение alexys2004 »

Не очень понял - в какой момент имена из раздела ":список имён" выносятся во временный файл?



и что делает операция:

more +9 "%~0">"%file_with_name%"



И ещё, я забыл сделать акцент в первом посте:

таких списков будет НЕ один, т.к. внешних файлов уже почти десяток - вот от них я хочу избавиться и засунуть все списки в один исполняемый файл, но каждый отдельно, чтобы обрабатывался по мере необходимости!

Собрать всё в один список - не вариант! надо, чтобы создавался в нужный момент отдельный файл с отдельным списком, взятым из конкретной области в исполняемом файле!





PHP код:

Код: Выделить всё

SET NAME=:список 1
FOR /F "usebackq tokens=* delims=" %%i IN ("%NAME%") DO (ECHO %%i>> файл.txt)
SET NAME=:список 2
FOR /F "usebackq tokens=* delims=" %%i IN ("%NAME%") DO (ECHO %%i>> файл.txt)
EXIT

:список 1
ИМЯ11
ИМЯ12
ИМЯ13

:список 2
ИМЯ21
ИМЯ22
ИМЯ23 



Аватара пользователя
alexys2004

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение alexys2004 »

Цитата alexys2004:



И ещё, я забыл сделать акцент в первом посте:

таких списков будет НЕ один
CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD




Это акцентище!




Цитата alexys2004:



Не очень понял - в какой момент имена из раздела ":список имён" выносятся во временный файл?
CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD





Цитата alexys2004:



и что делает операция:

more +9 "%~0">"%file_with_name%"
CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD




Именно это и делает - наполняет временный файл списком;




Цитата alexys2004:



Собрать всё в один список - не вариант! надо, чтобы создавался в нужный момент отдельный файл с отдельным списком, взятым из конкретной области в исполняемом файле!
CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD




Можно наверное и здесь что-нибудь придумать.
Аватара пользователя
Sham

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение Sham »

если список брать из внутренней переменной, то переносы нужно экранировать, оставляя пробелы между именами

Код:

Код: Выделить всё

@echo off
goto set_list1
:do
for %%i in (%LIST%) do echo "%%i"
pause
exit
:set_list1
set LIST=ИМЯ11^
 ИМЯ12^
 ИМЯ13
goto do

иначе нужно читать сам этот скрипт извне и искать в нём текст этого списка либо построчным поиском, либо регулярным выражением. Тут уже надо определяться с языком скрипта или утилитами типа grep, которых нет в системе.
Аватара пользователя
Sham

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение Sham »

если список брать из внутренней переменной, то переносы нужно экранировать, оставляя пробелы между именами

Код:

Код: Выделить всё

@echo off
goto set_list1
:do
for %%i in (%LIST%) do echo "%%i"
pause
exit
:set_list1
set LIST=ИМЯ11^
 ИМЯ12^
 ИМЯ13
goto do

иначе нужно читать сам этот скрипт извне и искать в нём текст этого списка либо построчным поиском, либо регулярным выражением. Тут уже надо определяться с языком скрипта или утилитами типа grep, которых нет в системе.
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение DJ Mogarych »

Цитата NickM:



Можно наверное и здесь что-нибудь придумать.
CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD




Изврат какой-то получился, но вроде работает как того требуется - списки в файле, обрамлены концом и началом:



Код:

Код: Выделить всё

@echo off
SetLocal EnableExtensions EnableDelayedExpansion
set /p "spisok=Ведите № списка:"
for /f "tokens=* delims=" %%i in ('more "%~0" ^| findstr /n "begin_%spisok%"') do (
set "b=%%i"
set "b=!b:::begin_%spisok%=!"
)
for /f "tokens=* delims=" %%i in ('more +%b% "%~0"') do (
if "%%i" NEQ ":end_%spisok%" (echo. %%i)
if "%%i" EQU ":end_%spisok%" goto :EOF
)
:begin_1
ИМЯ11
ИМЯ12
ИМЯ13
:end_1
:begin_2
ИМЯ21
ИМЯ22
ИМЯ23
ИМЯ24 
:end_2
:begin_3
ИМЯ31
ИМЯ32
ИМЯ33 
:end_3
:begin_4
ИМЯ41
ИМЯ42
:end_4
:begin_5
ИМЯ51
ИМЯ52
ИМЯ53
ИМЯ54 
ИМЯ55 
:end_5
Аватара пользователя
megaloman

Re: CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Сообщение megaloman »

Код:

Код: Выделить всё

@Echo Off &Cls
	Set "BoxOut=Z:\Box_Out"
	Set "@S1=File1.txt"
	Set "@S2=File2.txt"
	Set "@S3=File3.txt"
	Set "@S12345=File777.txt"
	Pushd "%BoxOut%"||(Echo Folder "%BoxOut%" not found &Pause &Exit /B 2)
	For /f "usebackq tokens=1* delims==" %%i IN (`Set "@S"`) Do >nul 2>&1 Del "%BoxOut%\%%j"
	For /f "usebackq tokens=1* delims=:" %%i IN (`FindStr /R /N /C:"^:@S" "%~dpnx0"`) Do Call :Out %%i %%j
Pause
Exit /B
:Out
	Call Set "OutFile=%%%2%%"
	For /f "usebackq delims=" %%s IN (`More +%1 "%~dpnx0"`) Do (
		Echo "%%s"|>nul Find ":@S"&&Exit /B
		>>"%BoxOut%\%OutFile%" Echo %%s
	)
Exit /B
:@S1
C:\Program Files\1 skjhdk kslhjdljsl sl;djl;jlsjd.txt
C:\Program Files\Advanced IP Scanner\2 sslm jds;ll; dalj;al lajl;akjsl;ka.png
C:\Program Files (x86)\3 aklljalkjs akjslkajlasjl akljlakjljs.dbf
:@S2
C:\Program Files\4 adSA SDASD DADADD.xls
C:\Program Files (x86)\5 aSDFDSA CSAS SAASAS.doc
:@S12345
8 adSA SDASD DADADD.xls
9 aSDFDSA CSAS SAASAS.doc
:@S3
C:\Program Files (x86)\6 adSA SDASD DADADD.xls
C:\Program Files\7 aSDFDSA CSAS SAASAS.doc

1. Списки должны быть последними в батнике.

2. Перед списками обязательно должен быть Exit

3. Список должен именоваться @Sxxxx и начинаться :@Sxxxx

4. Для каждого списка должно указываться имя выходного файла. Для разных списков выходной файл может совпадать.



В примере списков имена файлов абсолютно условны и могут быть как с путями, так и без - это уже тонкости, не указанные постановкой
Ответить

Вернуться в «Скриптовые языки администрирования Windows»