Попытка сделать меню в командной строке Windows - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть пакетный файл, который запускается пользователем, набрав:

usercompile filename

usercompile - это пакетный файл, который делает это:

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

, а затем запускает компилятор:

compiler.exe

Компилятор имеет имя «имя_файла», жестко запрограммированное в связанном источнике (его нельзя изменить), поэтому текущий метод заключается в простом копировании файла пользователя и переименовании его в известное имяи запустите компилятор.

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

Таким образом, это выглядело бы так:

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

, а затем пользователь вводит 1 или 2 или 3 (в данном случае) и нажимает ввод.Пакетный файл скопирует этот файл с известным именем и запустит компилятор.Единственная хорошая вещь - все файлы, которые должны быть перечислены, имеют уникальное расширение (.jal).

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Я изменил свой подход и считаю свой предыдущий ответ плохой практикой: повторный листинг файлов с помощью второй команды dir без необходимости снова считывает диск, не говоря уже о редком, но возможном случае добавления / удаления файла между двумяDir's и делает все это ненадежным.
На основе это блестящее решение Я сделал возможную реализацию с динамическим массивом:

@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

Это делает список файлов доступным длялюбое количество следующих команд.

0 голосов
/ 26 ноября 2018

Одним из возможных решений является перечисление всех файлов .jal и присвоение им номера опции, сохранение результата и, основываясь на вводе пользователя, поиск файла на основе номера опции.Поскольку я не знаю способа сохранить такой результат в памяти (без типа данных массива / хэш-таблицы), только в файле, если файл не может быть использован, то листинг должен повторяться детерминистическим образом, чтобы, если мы- присвоить номера опций, мы получим тот же результат.Мы можем сделать это, обеспечив алфавитное упорядочение.
Вот одна из реализаций:
BLOCK 1

setlocal enabledelayedexpansion

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

endlocal

Вложенная команда dir обеспечивает алфавитное упорядочение (ссылка.)
Замечание, почему я поставил трубу (|) в качестве разделителя: если вы не определите разделитель, будет использовано пространство по умолчанию.Если имя вашего файла содержит пробел, оно будет усечено.Поэтому я выбрал символ, который недопустим в именах файлов, чтобы гарантировать, что возвращается полное имя файла.

Теперь, если вы получили от пользователя число следующим образом:

set /p option=Choose your option: 

после этой команды (вычисление и, возможно, повторный запрос ввода), чтобы выполнить поиск файлаВы можете повторить BLOCK 1, но замените строку echo проверкой параметра, подобного следующему:

if !counter! == %option%

и поместите эти команды в блок if, чтобы сделать то, что вы хотите сделать с файлом (для отладки отложитекоманда echo).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...