如何在批处理 DOS 中模拟 bash select 命令?

如何在批处理 DOS 中模拟 bash select 命令?

你好,我有一个变量,其中包含一个由空格分隔的文件夹列表,我想显示这些元素,每个元素前面都有一个数字,用户通过输入与之关联的数字来选择一个文件夹,完成后,我想获取与该数字关联的元素并 cd 到它。在 Linux 中,您可以通过 select 命令执行此操作,但它是批处理,没有这样的命令,我认为 choice 命令对我而言没什么用。

为了显示它很好,这是我的代码:

@echo off
set folderlist=C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\TecsysCP C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\mast_main_dtw1i C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\dev_main_dtw1o

setlocal enabledelayedexpansion
Set Count=1

echo.
echo Please choose a folder:
echo.
for %%z in (%folderlist%) do (
  echo !Count!^) %%z
  Set /A Count+=1
)

答案1

只要您不是使用 XP,CHOICE 就可以正常工作,并且最大选择数量是有限的。

如果列表大小始终小于 10,那么您可以动态构建 CHOICE 键列表。(请注意,我将 ECHO 放在 CD 之前,以便我可以测试):

@echo off
setlocal enabledelayedexpansion
set folderlist=C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\TecsysCP C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\mast_main_dtw1i C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\dev_main_dtw1o

set count=1
set "choice="
echo(
echo Please choose a folder:
echo(
for %%F in (%folderlist%) do (
  echo !count!^) %%~F
  set "choice=!choice!!count!"
  set "option.!count!=%%F"
  set /a count+=1
)
echo(
choice /c %choice% /m ">" /n
echo cd !option.%errorlevel%!

如果列表大小可以超过 9,那么您可以预定义一个选择列表,并使用带有计数的子字符串来适当限制它们:

@echo off
setlocal enabledelayedexpansion
set folderlist=C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\TecsysCP C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\mast_main_dtw1i C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\dev_main_dtw1o C4 C5 C6 C7 C8 C9 C10 C11 C12

set count=0
set "choice=123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
echo(
echo Please choose a folder:
echo(
for %%F in (%folderlist%) do (
  for %%N in (!count!) do echo !choice:~%%N,1!^) %%~F
  set /a count+=1
  set "option.!count!=%%F"
)
echo(
choice /c !choice:~0,%count%! /m ">" /n
echo cd !option.%errorlevel%!

如果您必须支持 XP,或者如果您想要一个不受约束的列表,那么您可以切换到使用 SET /P。我包含了代码来验证用户的输入,如果值无效则循环返回。

@echo off
setlocal enabledelayedexpansion
set folderlist=C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\TecsysCP C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\mast_main_dtw1i C:\TecsysDev\iTopiaControlPanel\trunk\jboss-6.1.0.Final\server\dev_main_dtw1o C4 C5 C6 C7 C8 C9 C10 C11 C12

:menu
set count=1
set "valid= "
echo(
echo Please choose a folder:
echo(
for %%F in (%folderlist%) do (
  echo !count!^) %%~F
  set "valid=!valid!!count! "
  set "option.!count!=%%F"
  set /a count+=1
)
echo(
set "choice=0"
set /p "choice=> "
if "!valid: %choice% =!" equ "!valid!" (
  echo Invalid choice, please try again.
  pause
  goto menu
)
echo cd !option.%choice%!

相关内容