批次 - 附加变量项的列表

问题描述:

上使用下面的代码,我能够在一个目录下创建文件夹列表 -批次 - 附加变量项的列表

Setlocal EnableDelayedExpansion 
set /p pattern=Enter Search Term: 
echo. 
dir /b /A:D %pattern%* 

例如,如果用户输入CON,结果可能是

- CON struction1

- CON struction2

- CON struction_Docs

我希望能够将值附加到每个项目如。

1_Construction1

2_Construction_Docs

我是在想,我将不得不输出I创建一个.txt的初步名单,然后读取和可变附加到每一行修正?

的最终结果将是能够选择基于我们重视它的数量的项目之一,再有采取对项目进一步行动的用户。

+1

上次我看到一个菜单系统编码为批处理脚本是在Windows 3.1之前。这当然是可能的,但你确定vbscript或powershell不会让你更快,更容易维护解决方案吗?我意识到这属于“没有帮助”的范畴,但我浪费了大量的时间试图让批处理脚本执行它们不是为了构建的东西。 – christutty

+2

@christutty - 我发现,除非你操纵GUI或者使用不是整数或大于2^32的数字进行数学计算,否则批处理完全适合该任务。 – SomethingDark

+0

我只有批次的经验,而且在这方面的经验有限。从列表中选择一个项目的用户就像我计划制作的项目一样复杂,批处理的其余部分将是诸如robocopy和树之类的东西。但如果他们不太复杂,我愿意接受其他解决方案! 感谢您的输入 –

dir /b /A:D %pattern%*|find /n /v "" 

将产生

[1] construction1
[2] construction2
[3] construction_Docs

dir /b /A:D %pattern%*|findstr /n /v ":" 

将产生

1:construction1
2:construction2
3:construction_Docs

那么你可以尝试

set /a max=0 
for /f "delims=:" %%a in ('dir /b /A:D %pattern%*^|findstr /n /v ":" 2^>nul') do set /a max=%%a 

这将设置max为0,如果没有找到或最大数量

  • ^告诉批次,所述管/>被命令的一部分被执行
  • 2> NUL抑制没有匹配的情况下的错误消息发现

它当时的

一件简单的事
if %max%==0 echo none found&goto askagain 
set /p "selection=Please choose [1..%max%] ? " 
for /f "tokens=1*delims=:" %%a in ('dir /b /A:D "%pattern%*"^|findstr /n /v ":" 2^>nul') do if "%%a"=="%selection%" set "dirselected=%%b"&goto found 
echo %selection% is invalid 
goto askagain 
:found 
echo %dirselected% selected. 

做一个完整的工作。

+0

优秀的答案,但我会添加解释文本作为评论,以便任何人试图维护最终脚本有一些它的工作原理。恕我直言批处理脚本这个复杂的需要在汇编程序的同一级别进行评论。 – christutty

+0

这个工作起来,直到我尝试并选择其中一个选项 - 我收到错误“不是一个公认的命令” - 我哪里错了? –

+0

我**认为**我通过删除代码的第三行上的最后一个'do'命令并将%% b更改为%%来实现它的功能 –

这个任务是实现比较简单,如果你使用正确的工具,像一个数组:

@echo off 
setlocal EnableDelayedExpansion 

set /P "pattern=Enter Search Term: " 
echo/ 

rem Get the folders, store they in the array and show the menu 
set "num=0" 
for /D %%f in (%pattern%*) do (
    set /A num+=1 
    set "folder[!num!]=%%f" 
    echo !num!- %%f 
) 
if %num% equ 0 echo No folders found & goto :EOF 
echo/ 

:selectFolder 
set /P "num=Enter the desired folder: " 
echo/ 
if not defined folder[%num%] goto selectFolder 

set "item=!folder[%num%]!" 
echo Folder selected: %item% 

更详细的信息在批处理文件阵列管理,见this post