列出具有特定扩展名的目录和文件数量,构建特定菜单
Posted
技术标签:
【中文标题】列出具有特定扩展名的目录和文件数量,构建特定菜单【英文标题】:List Directory and number of files with specific extension, build a specific menu 【发布时间】:2021-10-31 09:29:13 【问题描述】:我正在尝试创建一个带有子菜单的菜单,其名称不带扩展名来自目录。但是,我无法将变量设置为数字。这段代码无论如何都不起作用。我还想在菜单中每个文件名的开头显示一个数字;事实上,文件的数量也将是用户选择作为输入的数量之一。我无法克服这个问题。
@echo off
cd C:\Users\Murray\Documents\ConfigFiles\
for /f %%A in ('dir /a-d-s-h /b *conf ^| find /v /c ""') do set count=%%A
echo File count = %count%
for %%F in ("C:\Users\Murray\Documents\ConfigFiles\*.conf") do echo %%~nxF
set choice=
set /C /N="Please choice: "
if "%choice%" == "%count%" goto SUBMENU
if NOT EXIST "C:\Users\Murray\Documents\ConfigFiles\%choice%" goto NOFILE
:SUBMENU
Echo You are here
goto end
:NOFILE
echo %choice% could not be found.
goto END
:end
任何帮助将不胜感激。
【问题讨论】:
这不是一个有效的命令:set /C /N="Please choice: "
。我建议您在尝试使用不存在的选项之前阅读您尝试使用的命令的帮助文件。
我做到了,但找不到解决方案来克服这个问题:如果我设置像 CHOICE C/12345 这样的选择数量,它适用于错误级别,但选择的数量必须取决于文件的数量。
您永远不会在代码中使用CHOICE
命令。仅当您使用数字时,选择命令也将限制为 9 个选项。如果您使用字母,您可以有 52 个选项,因为您可以有大写和小写。因此,如果您想要一个最大限制为 9 个文件选择的动态菜单,那么这是您需要查看的问答。 Create a menu from folder file list
我来看看网址。但是,如果我的文件夹中存在 90 个文件怎么办?那么,这意味着用户无法选择选项 11。我可以使用什么来克服此限制?
【参考方案1】:
Batch 的局限性应归咎于对该问题的低于标准的更正。 这是我能在几秒钟内完成的最好的:
@echo off
:one
cls
cd C:\Users\Murray\Documents\ConfigFiles\
for %%F in ("C:\Users\Murray\Documents\ConfigFiles\*.conf") do echo %%~nxF
echo.
echo Enter Configuration Name:
set/p "prompt=>"
if exist %prompt%.txt goto :two
if exist %prompt% goto :two
cls
echo File not found
pause >NUL
goto :one
:two
cls
REM When file is found, this code will run
pause >NUL
除非使用/p
开关指定,否则set
命令不会提示用户输入。为了使您的代码更友好,我还建议您在代码的前面提示输入文件路径。
编辑:一些替代解决方案:将choice
命令提示符的第 9 个选项声明为“第二页”或“更多”选项。对于拥有数十或数百个文件的目录中的用户来说,这确实是一种痛苦。其他;您可以在屏幕上的每个文件名之前为每个匹配您的准查询和echo
的文件分配一个整数,然后允许用户输入数字以获取该文件。这似乎相当有效,如果您想探索其中一个或两个替代方案,我可以提供帮助(如果您需要的话)。
【讨论】:
这真是太棒了!它完美无缺。非常感谢。事实上,我希望用户在数字中选择一个选项,因为文件名可能很长。总是欢迎帮助。在这一点上,@Compo 对解决方案的接触正是我在寻找的解决方案。【参考方案2】:这是the answer by on no 中吹捧的方法的一个简单示例。它将在屏幕上打印一个数字,后跟每个匹配文件扩展名的文件的名称,因此将允许大量匹配文件,(尽管最终用户可能必须滚动一个长列表)。选择文件后,您的最终用户只需键入其相应的编号。代码不应超出输入请求,直到列表中匹配的数字被 ENTERed。
@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion
Set "src=C:\Users\Murray\Documents\ConfigFiles"
Set "ext=.config"
If Not Exist "%src%\*%ext%" Echo No file matches.& GoTo End
For /F "Delims==" %%G In ('"(Set #) 2>NUL"') Do Set "%%G="
For /F "Delims==" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Call /? ^|
%SystemRoot%\System32\find.exe "=="') Do Set "HT=%%G"
For /F "Tokens=1* Delims=:" %%G In ('Dir /B /A:-D "%src%\*%ext%" 2^>NUL ^|
%SystemRoot%\System32\findstr.exe /E /I /L /N "%ext%"'
) Do Set "#%%G=%%H" & Echo( %%G.%HT:~-1%%%H
If Not Defined #1 Echo No file matches.& GoTo End
:Opt
Echo(
Set "HT=" & Set "opt="
Set /P "opt=Enter the number for your chosen file>"
If Not Defined opt (GoTo Opt) Else Set "opt=%opt:"=%"
Set # | %SystemRoot%\System32\findstr.exe /B /L "#%opt%=" 1>NUL || GoTo Opt
SetLocal EnableDelayedExpansion
For %%G In ("!#%opt%!") Do EndLocal & Set "opt=%%~G"
@Rem Your code goes below here
Echo(& Echo You Selected %opt%
@Rem Your code ends above here
:End
Setlocal EnableDelayedExpansion & For /F "Tokens=1,2" %%G In ("!CMDCMDLINE!"
) Do Endlocal & If /I "%%~nG" == "cmd" If /I "%%~H" == "/c" Echo(& Echo Press^
any key to exit.&Pause 1>NUL
如果有必要,您只需修改行4
和5
上的变量值,以便对其进行测试。除此之外,我不会支持更改或添加。测试完代码后,您可以在 25
和 29
行之间插入代码,替换我留在那里供您测试的示例行。
【讨论】:
优秀。非常感谢您的工作。太好了。我还需要提到@oh no solution 也有效,并给了我一些关于如何处理更多情况的提示。 只有一个很小的问题。我想自定义不带扩展名的菜单显示文件名?我可以更改哪个变量以将文件名显示为选项,同时仍在目录中搜索带有扩展名的文件? @Murray,要仅将文件基名打印到列表中,请将13
行的最后一个字符更改为这三个,~nH
波浪号,~
!即%%G.%HT:~-1%%%~nH
.
该问题与我的回答完全无关,仅与您自己添加的代码有关。请不要滥用那些解决了您问题的人,将他们视为您的个人支持代理人。您不需要所有这些代码,%opt%
已经定义为变量,所以使用它。将Echo(& Echo You Selected %opt%
,(正如您已经被告知的),替换为Copy /Y "%src%\%opt%" "%src%\.." 1>NUL
,它会按照您的代码指示将文件复制上一级,同时也抑制1 file(s) copied.
输出!
以上是关于列出具有特定扩展名的目录和文件数量,构建特定菜单的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 package.json 脚本复制具有特定文件扩展名的文件
如何在 Visual Studio Code 中列出/搜索特定类型的所有文件