Можно ли перебирать все файлы в каталоге и назначать номер каждому файлу и ждать ввода в сценарии cmd

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

Я знаю, что могу получить имена файлов с помощью dir /B *.gho, но я хотел бы, чтобы cmd перечислил каждое имя файла с номером и дождался ввода, а затем передал имя файла в переменную, чтобы его можно было объединить с другой переменной, содержащей команда для выполнения.

Пример:

  1. WinXP.gho
  2. Win7.gho
  3. Win10.gho

Какое изображение вы хотели бы использовать?

Я знаю, что могу написать что-то подобное в VB.net, но это будет использоваться на загрузочном диске PE, и, насколько я понимаю, приложения .net не работают в PE без некоторой работы. Может ли кто-нибудь указать мне правильное направление, как только я узнаю, что это можно сделать, и что искать, я, вероятно, смогу понять остальное сам.

Заранее спасибо.


person Natsuru    schedule 28.01.2021    source источник
comment
Добро пожаловать в SO, Нацуру. Цикл FOR можно использовать для вывода списка имен файлов. Используйте CHOICE /? и прочитайте о выборе опции. Если у вас возникли проблемы с кодом, который вы написали, скопируйте и вставьте его в вопрос как текст. Вопросы без кода следует отправлять на superuser.com.   -  person lit    schedule 28.01.2021


Ответы (1)


Предполагая, что findstr.exe находится в %SystemRoot%\System32 вашей базовой ОС PE, а текущий рабочий каталог, в котором выполняется этот скрипт, содержит ваши целевые .gho файлы, вот пример шаблона, который вы можете использовать:

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "ext=.gho"
For /F "Delims==" %%G In ('"(Set #) 2> NUL"') Do Set "%%G="
For /F "Tokens=1* Delims=:" %%G In ('Dir /B /A:-D "*%ext%" 2^> NUL ^| ^
 %SystemRoot%\System32\findstr.exe /E /I /L /N "%ext%"'
) Do Set "#%%G=%%H" & Echo( %%G.    %%H
If Not Defined #1 (Echo No file matches, press a key to exit.
    Pause 1> NUL & GoTo :EOF)
:Opt
Set "opt="
Echo(
Set /P "opt=Enter the number for your chosen file>"
Set "opt=%opt:"=%"
Set # | %SystemRoot%\System32\findstr.exe /B /L "#%opt%=" 1> NUL || GoTo Opt
SetLocal EnableDelayedExpansion
For %%G In ("!#%opt%!") Do EndLocal & Set "opt=%%G"
Echo(
Echo( You Selected %opt%
Pause

Поскольку это шаблон, расширение в строке 3 при необходимости можно заменить любым другим. Ваш собственный код будет написан из строки 18 (заменив три строки примера, которые я включил только для того, чтобы показать вам результат, теперь присвоенный %opt%. Ничего другого между этими двумя строками изменять не следует.

person Compo    schedule 28.01.2021
comment
Спасибо, я посмотрю, смогу ли я интегрировать это в свой PE с необходимыми изменениями. Я дам вам знать, как это сработало. Никогда не ожидал всего этого. - person Natsuru; 29.01.2021
comment
@Natsuru, если мой ответ касается вашей проблемы, отметьте его как принятый, нажав на большую серую галочку слева от нее. Прочтите Что делать, если кто-то ответит на мой вопрос?, чтобы узнать больше об этом процессе. - person Compo; 29.01.2021
comment
Кстати, я просто подумал, что из-за форматирования сайта я должен упомянуть, что пробел между %%G. и %%H в строке 7 является горизонтальным символом табуляции, а не серией пробелов. - person Compo; 29.01.2021
comment
Еще раз спасибо, вы только что дали мне хороший стартовый порт. Могу сказать, что моя рабочая нагрузка, вероятно, сократится вдвое. :D - person Natsuru; 31.01.2021