1

我正在处理一个批处理文件,以从目录中打开(使用资源管理器)用户指定的文件夹。所需文件夹只需要包含输入字符串(数字),并且该目录中的所有子目录都遵循相同的命名格式:“xxx xxx-%INPUT% yyyy...”。

我遇到的问题是在目录的 %INPUT% 编号之后还有唯一的描述(在命名格式示例中显示为“y”)。有什么办法可以忽略这些描述,只打开以字符串“xxx xxx-%INPUT%”开头的文件夹,或者只打开包含 %INPUT% 的文件夹(因为这也是唯一的)?我尝试在 xxx xxx-%INPUT% 之后使用星号,并希望 find 或 find 字符串命令可以提供帮助,但没有这样的运气。

这是我当前的代码,提前感谢您的帮助

@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 
4

1 回答 1

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如果用户只是按 ,则保持变量不变enter。通常,将SET变量的值设置为空字符串以确保不会意外保留旧数据是一个想法,但在这种情况下,您可以将其初始化为默认值。带引号的参数确保批处理行上的任何杂散空格不包含在分配给变量的值中。

Rabbit 的耳朵成批包含字符串,而不是单引号。在比较的每一侧使用它以允许包含空格的字符串。

0在输入字符串之前添加了一个任意字符,它应该适用于 100..999 以将其转换为 4 个字符的数字字符串。你暗示你的目标是一个 4 字符的数字字符串,但不要这么明确地说。1..99 会发生什么?

在输入0000数据之前进行字符串化,然后将值设置为自己的最后 4 个字符将确保字符串为 4 个字符长。

for/f处理dir目标目录的列表,以基本(仅名称)形式生成,/b并且/ad仅匹配目录*%input%*(顺便说一句 -*字符是星号......)该"delims="子句确保在匹配时应用包括空格在内的%%i 整个字符串被发现。

如果找到匹配项,input则设置为完整路径并处理切换到标签:nowindir,它运行资源管理器然后退出。我已经添加了一个GOTO :EOF结束批处理但不终止cmd.exe会话的那里 - 用于测试批处理可能需要重复运行的位置。在您的情况下,您可能需要删除goto :eof这将导致批处理EXIT

:label请注意和之间的区别::comment- 实际上,::comment它是一个无法访问的标签(因为它以两个开头:),但它通常比更具侵入性的REM语句更受欢迎。

我还将(修改后的)输入值添加到该INVALID INPUT行并简化...

最后,请注意我使用我的U:驱动器进行测试 - 您需要将其更改回您的P:

于 2013-08-09T14:08:41.653 回答