Создать нумерованный список на основе заданного списка строк

Windows CMD пакетная

У меня есть текстовый файл, который выглядит так:

Dog
Cat
Frog
Bat
Bird
Mouse

Я хочу приписать число каждой строке, каждой строке.

Так что становится

1 Dog
2 Cat
3 Frog
4 Bat
5 Bird
6 Mouse

Затем я хочу попросить пользователя ввести число, а затем сохранить соответствующую строку в переменной.

Так что, если пользователь вводит 1, то переменная устанавливается в строку Dog
Поэтому, когда пользователь вводит 1, программа сохраняет / выводит собаку

set /p var1="number? " так что var1 становится строкой, а не числом.

Это делает первую часть задачи вроде как, но теперь мне нужна вторая часть, хранящая строки в переменной.

@echo off
set TEXT_T="list.txt"

set /a c=0

setlocal ENABLEDELAYEDEXPANSION

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
  set /a c=c+1

  echo !c! %%i 
)
endlocal
pause

Здесь ниже обновленный ответ, благодаря LotPings.

С небольшим твиком попросить папку за строкой

Это обеспечивает более простой способ использования Megatools от CMD

https://megatools.megous.com/man/megals.html
https://github.com/megous/megatools

@echo off

:start:

megals /Root/

set /p var1="dir? " & megals /Root/%%var1%%

for /f "tokens=1,* delims=:" %%A in ('megals -n /Root/%%var1%% ^|findstr
/n "." ') do (
set Link[%%A]=%%B
Echo %%A %%B
)

for /f "tokens=1,* delims=:" %%A in ('megals -n -e /Root/%%var1%% ^|findstr
/n "." ') do (
set Link[%%A]=%%B
)

set /p choice=Select #:
Call Set Link=%%Link[%choice%]%%

set "trimmedlink="
for %%h in (%Link%) do if not defined trimmedlink set "trimmedlink=%%h"
Megadl %trimmedlink% && goto :start:

pause

Изменить: пришлось обрезать %Link% только первое слово, т.е. просто ссылка

Выход из Megals -e /Root/misc выглядит следующим образом: звездочка - это уникальные идентификаторы ссылок для файлов

                                                    /Root/misc
   https://mega.nz/#!********!********************* /Root/misc/File1
   https://mega.nz/#!********!********************* /Root/misc/File2
   https://mega.nz/#!********!********************* /Root/misc/File3

С пакетным скриптом выше это выглядит так:

1 File1
2 File2
3 File3
Select #:  <------input file number 

Исправлен листинг номера Edit2

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

1 File(1)

Выбранный номер файла затем передается Magadl как соответствующая ссылка
Megadl Link

Пакетный скрипт позволяет загрузить ссылку, просто введя соответствующий номер файла, чтобы вам не приходилось вводить длинный идентификатор ссылки в стандартном окне cmd.

4 ответа

Решение

Использовать вывод мегалов напрямую и избегать задержки (что убирает !)
Findstr / n выполнит нумерацию.

@echo off
for /f "tokens=1,* delims=:" %%A in ('megals -e /Root/ ^|findstr /n "." ') do (
  set Item[%%A]=%%B
  Echo %%A %%B
)
set /p choice=Select #:
Call Echo Choice:%%Item[%choice%]%%

Использование (псевдо) вызова с удвоенными знаками процента является старомодным методом реализации отложенного расширения без проблем с !,

В программировании / написании сценариев вы должны адаптировать методы к вашим потребностям.

Не зная точного выхода ваших мегатул,
это может сделать работу:

@echo off
for /f "tokens=1,* delims=:" %%A in ('megals -e /Root/ ^|findstr /n "." ') do (
  set Folder[%%A]=%%B
  Echo %%A %%B
)
set /p choice=Select #:
Call Set Folder=%%Folder[%choice%]%%

for /f "tokens=1,* delims=:" %%A in ('megals -e %Folder% ^|findstr /n "." ') do (
  set Link[%%A]=%%B
  Echo %%A %%B
)
set /p choice=Select #:
Call Set Link=%%Link[%choice%]%%

megadl %Link%

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

Just use an array:

@echo off
setlocal ENABLEDELAYEDEXPANSION

set TEXT_T="list.txt"

set /a c=0

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
  set /a c=c+1
  echo !c! %%i 
  set string[!c!]=%%i
)

set /P number=Enter number:
echo !string[%number%]!

pause

Для получения дополнительной информации см. Этот ответ.

Это не сработало

Мне нужен вывод Call Echo %%Item[%choice%]%%, переданного в Megadl

@echo off
for /f "tokens=1,* delims=:" %%A in ('megals -e /Root/anime ^|findstr /n "." ') do (
set Item[%%A]=%%B
Echo %%A %%B
)
set /p choice=Select #:
Call Echo %%Item[%choice%]%%

for /F "tokens=*" (`%%Item[%choice%]%%`) do (
set "var1=%%A"
Megadl !Var1!
)
pause

Как насчет преобразования команды в список вместо текстового файла в список?

поэтому строка с var1 здесь будет превращена в нумерованный список (файлы, перечисленные в этом каталоге), а Var2 - это число, которое вводят пользователи, чтобы создать возвращенную строку, которая передается команде. т.е.
https://megatools.megous.com/man/megals.html

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
(megals -e /Root/) <--------list all folders in root
(set /p var1="dir? " && megals -e /Root/!var1!) <-- select folder + list files
(set /p var2="Megalink? " && Megadl !var2!) <--- enter the file name for download
ENDLOCAL
pause

Я хочу иметь возможность ввести номер для загрузки вместо длинного имени файла. Таким образом, пользователь может ввести номер, соответствующий ссылке, которую он хочет скачать. Так что, если они вводят 1, то программа делает Megadl Dog

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

megals -e /Root/

set /p var1="dir? "

megals -e /Root/!var1! > rlist.txt

set TEXT_T="rlist.txt"

set /a c=0

FOR /F "tokens=1 usebackq" %%i in (%TEXT_T%) do (
set /a c=c+1
echo !c! %%i 
set string[!c!]=%%i
)

set /P number=Enter number:
Megadl !string[%number%]!
Endlocal
pause

Это убивает первую часть ссылки, поскольку удаляет все, что находится между ними, включая восклицательные знаки.! Dasasdasd!
все мегалинки начинаются с #! чего-то!

Другие вопросы по тегам