如何在批处理脚本中从文件搜索中创建可选列表?

时间:2012-10-05 14:47:15

标签: batch-file dos

我想创建一个批处理文件,它将搜索目录中所有.sln文件的文件,然后将它们显示为列表,这样用户就可以从列表中选择他们想要的文件并打开该文件。不确定如何存储文件以使其成为列表。这就是我到目前为止所拥有的......

set TT_API_PATH=C:\dir
cd %TT_API_PATH%
dir /b /s *.sln 
set cmd=dir /b /s *.sln 
FOR /F %%i IN (' %cmd% ') DO SET X=%%i

1 个答案:

答案 0 :(得分:3)

编辑:call echo %%x] !choice[%%x]!替换了不必要且危险的echo %%x] !choice[%%x]!命令。甚至不确定为什么我把它包括在内。

注意:

忽略单独的:行,由于某种原因,我的代码中的所有空行都会崩溃,并且必须在空行上放置一些内容以保留格式。遗憾。

@echo off
setlocal enabledelayedexpansion
set count=0

:
:: Read in files
for %%x in (*.sln) do (
  set /a count=count+1
  set choice[!count!]=%%x
)

:
echo.
echo Select one:
echo.

:
:: Print list of files
for /l %%x in (1,1,!count!) do (
   echo %%x] !choice[%%x]!
)
echo.

:
:: Retrieve User input
set /p select=? 
echo.

:
:: Print out selected filename
echo You chose !choice[%select%]!

编辑:更改了示例以包含所请求的子目录。

为了满足您在子目录中找到的sln文件的请求,我将for %%x in (*.sln)更改为for /f %%x in ('dir /s /b *.sln')执行dir /s /b *.sln命令,该!choice[%%x]!仅返回当前目录中找到的sln文件在当前目录中并返回结果。

为了使输出尽可能干净清晰,我还更改了从整个路径!choice[%%x]:%cd%\=!列出文件时打印的内容到从当前目录%cd%开始的相对路径(其中替换当前路径和目录(\)加上反斜杠(@echo off setlocal enabledelayedexpansion set count=0 : :: Read in files for /f %%x in ('dir /s /b *.sln') do ( set /a count=count+1 set choice[!count!]=%%x ) : echo. echo Select one: echo. : :: Print list of files for /l %%x in (1,1,!count!) do ( echo %%x] !choice[%%x]:%cd%\=! ) echo. : :: Retrieve User input set /p select=? echo. : :: Print out selected filename echo You chose !choice[%select%]! ),什么也没有。)

choice[#]

上面的代码只显示从当前目录到文件的相对路径,但保留变量for /f %%x...内的完整路径。


如果您根本不想处理整个路径,可以添加一行for /l %%x ...循环,并恢复{中的回显线{1}}循环到(编辑过的)第一个示例中的代码,以便代码看起来像这样(解释更改所需的时间与显示整个代码一样长),所以:

@echo off
setlocal enabledelayedexpansion
set count=0

:
:: Read in files
for /f %%x in ('dir /s /b *.sln') do (
    set /a count=count+1
    set choice[!count!]=%%x
    for %%y in (!count!) do set "choice[%%y]=!choice[%%y]:%cd%\=!"
)

:
echo.
echo Select one:
echo.

:
:: Print list of files
for /l %%x in (1,1,!count!) do (
     echo  %%x] !choice[%%x]!
)
echo.

:
:: Retrieve User input
set /p select=? 
echo.

:
:: Print out selected filename
echo You chose !choice[%select%]!

编辑/恢复echo语句并非严格必要,并且根本不会更改输出,但它是一个很好的编程实践,因为它只是识别出当前目录的路径最初读入文件名时,choice[#]变量已被删除。更改它会消除不必要的复杂性,并在代码被更改或适应其他用途时删除可能出现的意外结果。如果单独留下该行,它将再次尝试用变量choice[#]替换当前目录的所有实例。当它无法替换任何东西时,它只会保持字符串不变。