我想制作一个批处理文件,它将搜索目录中所有 .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
我想制作一个批处理文件,它将搜索目录中所有 .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
编辑:将不必要且危险的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)
,它只返回在当前目录中找到的 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%]!
上面的代码仅显示从当前目录到文件的相对路径,但将完整路径保留在变量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%]!
编辑/恢复该echo
语句并不是绝对必要的,并且根本不会更改输出,但这是一种很好的编程习惯,因为它只是识别出choice[#]
在最初读取文件名时变量中当前目录的路径已经被删除的事实. 更改它可以消除不必要的复杂性,并消除如果代码被更改或适应其他用途时可能出现的意外结果。如果您不理会该行,它将再次尝试用任何内容替换变量中当前目录的所有实例choice[#]
。当它无法替换任何内容时,它将简单地保持字符串不变。