我正在处理批处理文件,以便从目录中打开(使用资源管理器)用户指定的文件夹。所需的文件夹只需要包含输入字符串(数字),并且此目录中的所有子目录遵循相同的命名格式: “xxx xxx-%INPUT%yyyy ......”。
我遇到的问题是在目录的%INPUT%数之后还有唯一的描述(在命名格式示例中显示为“y”)。有没有办法忽略这些描述,只打开以字符串“xxx xxx-%INPUT%”开头的文件夹或只是包含%INPUT%(因为这也是唯一的)?我尝试在xxx xxx-%INPUT%之后使用星号,并希望查找或查找字符串命令可以帮助但没有这样的运气。
以下是我目前的代码,请提前感谢您的帮助
@ECHO OFF
C:
CD\
CLS
:MENU
CLS
ECHO ======= Input Job Number ========
SET /P INPUT=Please input job number or press 'Q' to quit...
IF /I '%INPUT%'=='Q' GOTO Quit
IF %INPUT% LSS 1000 set INPUT=0%INPUT%
IF NOT EXIST "P:\a\b\c\%INPUT%" GOTO INVALID ELSE GOTO NOWINDIR ::ideally this would check if any folder contains the input string
::NOWINDIR
%SystemRoot%\explorer.exe "P:\a\b\c\%INPUT%" ::ideally this would open the folder containing that input string
::Invalid
CLS
ECHO ============INVALID INPUT============
ECHO -------------------------------------
ECHO Please input valid job number or 'Q' to quit.
ECHO -------------------------------------
ECHO ======PRESS ANY KEY TO CONTINUE======
PAUSE > NUL
GOTO MENU
::Quit
EXIT
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL
C:
CD\
:MENU
CLS
ECHO ======= Input Job Number ========
:again
SET "INPUT=Q"
SET /P INPUT=Please input job number or press 'Q' to quit...
IF /I "%INPUT%"=="Q" GOTO Quit
set INPUT=0000%INPUT%
set INPUT=%INPUT:~-4%
FOR /f "delims=" %%i IN (
'dir /b /ad "U:\a\b\c\*%INPUT%*" 2^>nul'
) DO SET "input=U:\a\b\c\%%i"&GOTO nowindir
::Invalid
ECHO ============INVALID INPUT %input%===========
GOTO again
:NOWINDIR
%SystemRoot%\explorer.exe "%INPUT%"
:Quit
GOTO :EOF
EXIT
这应该让你开始。
如果用户只需按输入, SET /P
将保持变量不变。通常,将SET
变量的值设置为空字符串以确保不会意外保留过时数据是个明智之举,但在这种情况下,您可以将其初始化为默认值。引用的参数确保批处理行上的任何杂散空间都不包含在赋给变量的值中。
兔子的耳朵分批包围字符串,而不是单引号。在比较的每一侧使用此选项以允许包含空格的字符串。
您在输入字符串之前添加了一个任意0
,它应该适用于100..999,以将其转换为4个字符的数字字符串。你暗示你的目标是一个4个字符的数字字符串,但没有明确说明。 1..99会发生什么?
在输入数据之前对0000
进行字符串输入,然后将值设置为自己的最后4个字符将确保字符串长度为4个字符。
for/f
处理目标目录的dir
列表,以/b
基本(仅限名称)格式生成,/ad
仅列出与{{1}匹配的目录}(顺便说一句 - *%input%*
字符是星号...)*
子句确保包含空格的整个字符串应用于"delims="
如果匹配找到了。
如果找到匹配项,则将%%i
设置为完整路径并将处理切换到运行资源管理器然后退出的标签input
。我添加了一个:nowindir
,它结束了批处理,但没有终止GOTO :EOF
会话 - 用于测试批处理可能需要重复运行的位置。在您的情况下,您可能需要删除cmd.exe
,这会导致批次goto :eof
请注意EXIT
和:label
之间的区别 - 实际上,::comment
是一个无法访问的标签(因为它以两个::comment
开头)但它通常更倾向于更具侵入性:
声明。
我还将(修改的)输入值添加到REM
行并简化了...
最后,请注意我使用了INVALID INPUT
驱动器进行测试 - 您需要将其更改回U: