【问题标题】:Create a numbered list based on a given list of strings根据给定的字符串列表创建编号列表
【发布时间】:2018-03-29 20:32:32
【问题描述】:

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。

【问题讨论】:

  • 能否请edit your question 包含您编写或尝试过的代码,(这不是订购服务的免费代码)
  • 另外请阅读this guide,了解如何正确提问。
  • 肯定选择tour,阅读How to Ask,和minimal reproducible example
  • 运行choice /?,同时在这个网站上搜索您的菜单问题的现有答案。
  • 这样编号怎么办:find /N /V "" "list.txt"findstr /N /R "^" "list.txt"

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


【解决方案1】:

直接使用 megals 输出并避免延迟扩展(删除 !
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 的建议,请edit您的问题包含所有必要信息 - 不要强迫他人从不必要的答案和 cmets 中收集。

【讨论】:

  • 我仍然需要提供 Megadl 的链接
  • 查看我的增强答案。
  • 我会尝试清理一下帖子,抱歉这是我在这里的第一篇帖子。理想情况下,最好让程序通过名称(字符串)而不是数字来提示文件夹,只有文件夹中列出的文件需要使用数字进行输入。 Megals 自动按名称列出文件夹,因此用户输入文件夹名称,获取文件列表,然后询问文件编号会更直观。 Cmd 没有简单的复制粘贴是所有这些大声笑的原因。我会在这里看看你的代码。
  • 如果您在 cmd 窗口的系统菜单/设置/选项选项卡中勾选 Quick-edit-modeinsert-mode,则复制和粘贴将起作用(在最近的 win10 中也可以使用 Ctrl+V 进行粘贴)鼠标标记并右键单击复制。您还可以使用即dir |clip.exe 将输出直接重定向到剪贴板
  • 这是在Win7系统上,所以cmd还是有点别扭。不过 Pipe to Clip 很方便。
【解决方案2】:

只使用一个数组:

@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

【讨论】:

  • 谢谢,太好了。我也想知道从命令输出而不是 txt 文件中读取。
  • 只需将命令括在撇号之间即可:FOR /F "tokens=1" %%i in ('TYPE %TEXT_T%') do (
【解决方案3】:

将命令的输出变成列表而不是文本文件变成列表怎么样?

因此,此处带有 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!
所有超链接都以 #!something! 开头!

【讨论】:

  • 无需使用var1 变量的延迟扩展。
  • @JimJamil,megals -e /Root/directory 的内容和你原来的list.txt 文件显示的内容一样吗?如果没有,请编辑您的问题以提供新要求和该命令的内容。
  • 这是一个megalinks列表,每行一个megatools.megous.com/man/megatools.html#_tools_overview
  • @JimJamil,没有显示输出,我需要查看它,如果您需要有关解析它以在菜单和相关变量系统中使用的建议。
  • Megals -e /Root/anime 的输出 类似mega.nz/#Link 的链接列表 由于某种原因,每个链接之前也有四个空白列。
【解决方案4】:

这没用

我需要将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多