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

Bul*_*127 0 dos batch-file

我想制作一个批处理文件,该文件将搜索目录中所有 .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
Run Code Online (Sandbox Code Playgroud)

Jam*_*s K 5

编辑:更换不必要的和危险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%]!
Run Code Online (Sandbox Code Playgroud)

编辑:更改示例以根据要求包含子目录。

为了满足您对子目录中找到的sln文件的要求,我更改了for %%x in (*.sln),它只返回当前目录中找到的sln文件for /f %%x in ('dir /s /b *.sln'),执行dir /s /b *.sln当前目录中的命令并返回结果。

为了使输出尽可能干净和清晰,我还将从整个路径列出文件时打印的内容更改为!choice[%%x]!从当前目录开始的相对路径!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%]!
Run Code Online (Sandbox Code Playgroud)

上面的代码只显示从当前目录到文件的相对路径,但在变量中保留了完整路径choice[#]


如果你根本不想处理整个路径,你可以在循环中添加一行,并将for /f %%x...循环中的echo行恢复for /l %%x ...到(编辑过的)第一个示例中的那行,这样代码看起来像这样(解释更改的位置与显示整个代码一样长,因此):

@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%]!
Run Code Online (Sandbox Code Playgroud)

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