Нужна помощь в упрощении командного файла - PullRequest
1 голос
/ 19 февраля 2020

У меня есть командный файл, который копирует некоторые файлы на основе пользовательского ввода, и я хочу упростить его. Если пользователь вводит букву A в приглашении, он копирует A.txt из C: \ в E: \ По сути, это выглядит так:

set /p letter="Enter a letter of the alphabet"
if /i [%letter%]==[A] GOTO LetterA 
if /i [%letter%]==[B] GOTO LetterB 
if /i [%letter%]==[C] GOTO LetterC 
:LetterA 
robocopy C:\ E:\ A.txt 
:LetterB 
robocopy C:\ E:\ B.txt 
:LetterC 
robocopy C:\ E:\ C.txt 
:end

Должен ли я печатать / копировать каждая строка для каждой буквы алфавита, как для оператора IF, так и для команды goto, которую она вызывает? Могу ли я выполнить sh это проще с помощью оператора for для l oop или if и, в основном, сказать ..

For %letter% 
robocopy C:\ E:\ %letter%.txt

Или как оператор IF, ссылающийся на файл list.txt .. тогда как list. txt содержит все буквы алфавита ..

IF %letter% in (C:\list.txt)
then robocopy C:\ E:\ %letter%.txt

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Простой ответ:

@echo off
set /p "letter=Enter a letter of the alphabet: "
for %%x in (a b c d e f g h i j k l m n o p q r s t u w x y z) do if /i "%letter%" equ "%%x" robocopy C:\ E:\ %%x.txt

Однако он не может обрабатывать отравленные символы, но намного безопаснее, чем findstr .

1 голос
/ 19 февраля 2020

По сути, вы ищете способ убедиться, что входные данные находятся в пределах предопределенного набора. Вы можете сделать это следующим образом:

@echo off
setlocal
:loop
set /p "letter=Enter a letter of the alphabet: "
echo %letter%|findstr /ix "a b c d e f g h i j k l m n o p q r s t u v w x y z" || goto :loop
ECHO robocopy C:\ E:\ %letter%.txt

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

...