Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

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

Аватара для alexys2004

Новый участник


Сообщения: 42
Благодарности: 2

Профиль | Отправить PM | Цитировать


Здравия всем!
Уважаемые знатоки, требуется ваша помощь!
Есть стандартный цикл, который берёт из внешнего файла имена и записывает их в другой файл!
Пока этих файлов была пара, было терпимо, а теперь россыпь из десятка файлов начинает раздражать!
Возможно ли сделать так, чтобы цикл брал имена из списка внутри самого исполняемого CMD ?
Например, цикл обращается к некоему списку имён, который прячется в конце файла после EXIT и дальше записывает их во внешний файл..

PHP код: Выделить весь код

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

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

Крайне благодарен, если есть решение!

-------
Компьютерная помощь в Симферополе! vk.com/kp_pro


Отправлено: 07:07, 11-04-2025

 

Аватара для NickM

Ветеран


Contributor


Сообщения: 4621
Благодарности: 1108

Профиль | Отправить PM | Цитировать


Не совсем список, но, работает:
Код: Выделить весь код
@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
А, вообще, вариантов много можно придумать, например, с тем же временным файлом, в который список помещать, а после его читать и прочее.

Отправлено: 07:33, 11-04-2025 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для alexys2004

Новый участник


Сообщения: 42
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

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

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

-------
Компьютерная помощь в Симферополе! vk.com/kp_pro


Отправлено: 07:49, 11-04-2025 | #3


Аватара для NickM

Ветеран


Contributor


Сообщения: 4621
Благодарности: 1108

Профиль | Отправить PM | Цитировать


Цитата alexys2004:
Что касается "временного файла" - тоже думал, но в крайнем случае.. проще, наверное, всю эту россыпь в архив собрать. »
Никакой россыпи, например:
Код: Выделить весь код
@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

Отправлено: 08:48, 11-04-2025 | #4


Аватара для alexys2004

Новый участник


Сообщения: 42
Благодарности: 2

Профиль | Отправить PM | Цитировать


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

и что делает операция:
more +9 "%~0">"%file_with_name%"

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

PHP код: Выделить весь код

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

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

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

-------
Компьютерная помощь в Симферополе! vk.com/kp_pro


Последний раз редактировалось alexys2004, 11-04-2025 в 10:37.


Отправлено: 10:28, 11-04-2025 | #5


Аватара для NickM

Ветеран


Contributor


Сообщения: 4621
Благодарности: 1108

Профиль | Отправить PM | Цитировать


Цитата alexys2004:
И ещё, я забыл сделать акцент в первом посте:
таких списков будет НЕ один »
Это акцентище!

Цитата alexys2004:
Не очень понял - в какой момент имена из раздела ":список имён" выносятся во временный файл? »
Цитата alexys2004:
и что делает операция:
more +9 "%~0">"%file_with_name%" »
Именно это и делает - наполняет временный файл списком;

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

Отправлено: 10:40, 11-04-2025 | #6


Deadooshka


Сообщения: 2559
Благодарности: 697

Профиль | Отправить PM | Цитировать


если список брать из внутренней переменной, то переносы нужно экранировать, оставляя пробелы между именами
Код: Выделить весь код
@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, которых нет в системе.

Отправлено: 12:52, 11-04-2025 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6678
Благодарности: 1560

Профиль | Отправить PM | Цитировать


Powershell, запрос номера списка и вывод в файл.
Код: Выделить весь код
$list1 = ("
ИМЯ11
ИМЯ12
ИМЯ13
") -split "`n" -match "\w"

$list2 = ("
ИМЯ21
ИМЯ22
ИМЯ23
") -split "`n" -match "\w"

$list3 = ("
ИМЯ31
ИМЯ32
ИМЯ33
") -split "`n" -match "\w"

$l = read-host "Номер списка для вывода в файл"
switch ($l) {
    1 {$selectedList = $list1}
    2 {$selectedList = $list2}
    3 {$selectedList = $list3}
}
$selectedList |out-file "c:\temp\file.txt" -Encoding default

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:57, 11-04-2025 | #8


Аватара для NickM

Ветеран


Contributor


Сообщения: 4621
Благодарности: 1108

Профиль | Отправить PM | Цитировать


Цитата NickM:
Можно наверное и здесь что-нибудь придумать. »
Изврат какой-то получился, но вроде работает как того требуется - списки в файле, обрамлены концом и началом:
Код: Выделить весь код
@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

Последний раз редактировалось NickM, 11-04-2025 в 16:13.


Отправлено: 13:36, 11-04-2025 | #9


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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. Для каждого списка должно указываться имя выходного файла. Для разных списков выходной файл может совпадать.

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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 11-04-2025 в 17:10.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:59, 11-04-2025 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как взять в цикл FOR имена изнутри самого исполняемого CMD

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - Переопределить вывод внутри самого файла CMD El Scorpio Скриптовые языки администрирования Windows 3 01-11-2022 22:07
CMD/BAT - Запуск исполняемого файла (EXE) через скрипт CMD с вводом параметров dm7203 Скриптовые языки администрирования Windows 1 01-11-2018 18:24
CMD/BAT - [решено] как запустить cmd на удаленной машине чтобы cmd отобразилось у меня Mickle Скриптовые языки администрирования Windows 13 21-09-2010 14:43
Интерфейс - Как посмотреть версию исполняемого файла с произвольным расширением Vic21 Microsoft Windows 7 2 16-11-2009 15:12
CMD/BAT - [решено]*.cmd: цикл перебирает значения и каждое значение проверяется skeletor Скриптовые языки администрирования Windows 1 15-03-2007 16:11




 
Переход