尝试在Windows命令提示符下制作菜单

时间:2018-11-25 19:02:13

标签: cmd command-prompt

我有一个批处理文件,可以通过用户键入以下内容来运行:

usercompile filename

usercompile是执行此操作的批处理文件:

copy  /y %1.txt lib\incoming_file.txt

然后启动编译器:

compiler.exe

编译器将“ incoming_file”名称硬编码到链接源中(无法更改),因此当前方法只是复制用户文件并将其重命名为已知名称并运行编译器。

我想向用户提供运行批处理文件时生成的文件列表,然后该批处理文件将复制所选文件,并将其重命名(就像现在所做的那样)。

所以它看起来像这样:

Please choose a file to compile:
1) matthews_build
2) marks_build
3) lukes_build

,然后用户输入1或2或3(在这种情况下)并按Enter。批处理文件会将那个文件复制到已知的文件名并启动编译器。一件好事是,所有需要列出的文件都具有唯一的扩展名(.jal)。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是列出所有.jal文件并为其提供一个选项号,存储结果,然后根据用户输入,根据选项号查找文件。据我所知,没有办法将这样的结果存储在内存中(没有数组/哈希表数据类型),只能存储在文件中,如果无法使用文件,则应以确定性的方式重复列出,以便我们-分配选项号,我们得到相同的结果。我们可以确保按字母顺序排序。
这是一个实现:
1座

setlocal enabledelayedexpansion

FOR /f "delims=|" %%i IN ('dir /b /on "yourpath\*.jal"') DO (
    set /a counter+=1
    echo !counter!^) %%~ni
)

endlocal

nested dir命令可确保字母顺序(reference.)
关于为什么将竖线(|)用作分隔符的说明:如果您未定义分隔符,则将使用默认空间。如果文件名包含空格,则它将被截断。因此,我选择了一个在文件名中无效的字符,以确保返回整个文件名。

现在,如果您是通过以下方式从用户那里获得电话号码的:

set /p option=Choose your option: 

在执行此命令(评估并可能重新请求输入)以查找文件之后,您可以重复执行块1,但通过检查以下选项来替换回显行:

if !counter! == %option%

并将这些命令放在if块中,以对文件执行任何操作(要进行调试,请放回echo命令)。

答案 1 :(得分:0)

我改变了方法,并认为以前的回答是一种不好的做法:使用第二个dir命令重新列出文件会不必要地再次读取磁盘,更不用说在两个文件之间添加/删除文件的罕见但可能的情况了目录,使整个过程变得不可靠。
基于this brilliant solution,我对动态数组进行了可能的实现:

@echo off

set /a counter=0

setlocal enabledelayedexpansion
FOR /f "delims=|" %%i IN ('dir /b /on "yourpath*.jal"') DO (
    set /a counter+=1
    rem echo !counter!^) %%~ni
    set FileList[!counter!]=%%~ni & rem This is an array element, a dinamically created variable
)

rem Iterate through variables:
FOR /l %%i IN (1,1,!counter!) DO (
    echo %%i^) !FileList[%%i]!
)

set /p option="Choose an option: "
echo !FileList[%option%]!

endlocal

这使得文件列表可用于任意数量的以下命令。