0

我想制作一个批处理文件,它将搜索目录中所有 .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
4

1 回答 1

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%]!

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

为了满足您对在子目录中找到的 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[#]。当它无法替换任何内容时,它将简单地保持字符串不变。

于 2012-10-07T06:45:45.443 回答