【问题标题】:Trying to make a menu in a windows command prompt尝试在 Windows 命令提示符下创建菜单
【发布时间】:2019-04-27 11:51:10
【问题描述】:

我有一个由用户输入运行的批处理文件:

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)。

有什么想法吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请发布脚本的相关部分,以便其他人更容易理解问题并提供解决方案。
  • 更好?删除了所有不必要的信息。
  • 我对 Windows cmd 了解不多。但你不是在寻找这里的东西吗? stackoverflow.com/questions/1223721/…
  • 有点,但这并没有列出具有给定扩展名的所有文件或根据用户输入复制这些文件。这仅表明您确实可以使用用户输入制作菜单。

标签: cmd command-prompt


【解决方案1】:

我改变了我的方法,并认为我之前的回答是一种不好的做法:使用第二个 dir 命令重新列出文件会不必要地再次读取磁盘,更不用说在 2 之间添加/删除文件的罕见但可能的情况目录,使整个事情变得不可靠。
基于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

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

【讨论】:

    【解决方案2】:

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

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

    嵌套的 dir 命令确保按字母顺序排列(reference.)
    说明为什么我将管道 (|) 作为分隔符:如果您不定义分隔符,将使用默认空格。如果您的文件名包含空格,那么它将被截断。所以我选择了一个在文件名中无效的字符,以确保返回整个文件名。

    现在,如果您通过以下方式从用户那里得到一个号码:

    set /p option=Choose your option: 
    

    在此命令之后(评估并可能重新请求输入)以查找文件,您可以重复 BLOCK 1,但将 echo 行替换为检查选项,如下所示:

    if !counter! == %option%
    

    并将这些命令放在 if 块中,以便对文件执行任何您想做的事情(为了调试,放回 echo 命令)。

    【讨论】:

    • 谢谢!到目前为止,列表已建立,提示接受了一个选择,但我似乎无法获得选择号来实际执行任何操作。这就是我所拥有的:@echo off setlocal enabledelayedexpansion FOR /f "delims=|" %%i IN ('dir /b /on "*.jal"') DO ( set /a counter+=1 echo !counter!^) %%~ni ) endlocal set /p option=Choose your option: FOR /f "delims=|" %%i IN ('dir /b /on "*.jal"') DO ( set /a counter+=1 if !counter! == goto action ) goto failed :action echo here we go echo counter :failed echo didn't quite get it pause
    • 对不起,我正在努力格式化此页面上的代码:/
    • 如果!计数器! == goto 操作不正常。如果!计数器! == %option% 转到操作
    • 仍然没有捕捉到它,现在使用 if !counter! == %option% goto action - 仍然没有看到数字。总是去失败部分
    • 甚至回显 %option% 并且它确实正确存储了数字,但它似乎永远无法将其与文件名之一匹配。感谢您的耐心等待...
    猜你喜欢
    • 2011-04-02
    • 2014-07-25
    • 2021-02-16
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多