根据给定的字符串列表创建编号列表

时间:2018-03-29 20:32:33

标签: windows loops batch-file command-line cmd

windows cmd批次

我有一个看起来像这样的文本文件:

Dog
Cat
Frog
Bat
Bird
Mouse

我想将一个数字归于每个字符串,每行。

这样就变成了

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

然后我想让用户输入一个数字,然后将相应的字符串存储在变量中。

因此,如果用户输入1,则变量设置为字符串Dog
因此,当用户输入1时,程序存储/输出Dog

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。

通过小调整来按字符串

询问文件夹

这提供了一种更简单的方法来使用CMD的Megatools

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的输出如下所示: 星号是文件的唯一链接ID

                                                    /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窗口中输入长链接ID。

4 个答案:

答案 0 :(得分:1)

只需使用数组:

@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

有关详细信息,请参阅this answer

答案 1 :(得分:1)

直接使用兆字节输出并避免delayedexpansion(删除!
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%]%%

使用带有双倍百分号的(伪)调用是一种老式的实现延迟扩展的方法,而!没有问题。

在编程/脚本编写中,您需要调整技术以满足您的需求。

在不知道您的megatools的确切输出的情况下,
这可以做到这一点:

@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%

根据公司建议,请edit您的问题包含所有必要信息 - 不要强迫他人从不必要的答案和评论中收集信息。

答案 2 :(得分:0)

如何将命令输出到列表中,而不是将文本文件输出到列表中?

所以这里带有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!
所有megalinks都以#!开头!

答案 3 :(得分:0)

这不起作用

我需要输出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