我想写一个批处理文件来查找给定图纸和配置的最新版本
扫描地图和脚本找到最新修订版时,我希望脚本打开最新修订版和倒数第二个修订版。
例如,在地图中我有
0036255-002-003
0036255-002-002
0036255-002-005
0036255-002-004
我要提示问我图号和配置号,所以我输入“0036255-002”
现在我想让脚本扫描地图并找出 0036255-002-005 是我正在寻找的最新修订版的绘图。现在我希望它同时打开 0036255-002-005 和 0036255-002-004。 (最后一个和倒数第二个)。
这是我的脚本,但它只会打开最新版本的文件。然后它会告诉我“系统‘无法’找到文件 lmax_file! 。'“ 有人可以帮我吗?无论我尝试什么,它似乎都无法找到倒数第二个修订文件……
@echo off
set /p "numbers=Enter the drawing number and configuration number: "
set "max_rev=-1"
set "second_max_rev=-1"
set "max_file="
set "second_max_file="
for /r %%f in (*%numbers%*) do (
set "filename=%%~nf"
set "ext=%%~xf"
set "rev=!filename:*-=!"
set "rev=!rev:*-=!"
if !rev! gtr !max_rev! (
set "second_max_rev=!max_rev!"
set "second_max_file=!max_file!"
set "max_rev=!rev!"
set "max_file=%%f"
) else if !rev! gtr !second_max_rev! (
set "second_max_rev=!rev!"
set "second_max_file=%%f"
)
)
if defined second_max_file (
echo Opening %max_file% and %second_max_file%
start "" "%max_file%"
start "" "%second_max_file%"
timeout /t 5 /nobreak >nul
) else (
echo No files found matching %numbers%
)
pause
我对批处理文件没有真正的经验,所以欢迎和感谢所有帮助。
我运行了上面提到的代码
它找到了最后一个版本,但找不到倒数第二个。即使我尝试了一个他只寻找倒数第二个的脚本,它也找不到。所以感觉它对“倒数第二个”的定义有困难
这是我试过的只找到倒数第二个的脚本:
@echo off
set /p "numbers=Enter the oproepnummers and configuratienummers: "
set "max_rev=-1"
set "second_max_rev=-1"
set "max_file="
set "second_max_file="
for /r %%f in (*%numbers%*) do (
set "filename=%%~nf"
set "ext=%%~xf"
set "rev=!filename:*-=!"
set "rev=!rev:*-=!"
if !rev! gtr !max_rev! (
set "second_max_rev=!max_rev!"
set "second_max_file=!max_file!"
set "max_rev=!rev!"
set "max_file=%%f"
) else if !rev! gtr !second_max_rev! (
set "second_max_rev=!rev!"
set "second_max_file=%%f"
)
)
if defined second_max_file (
echo Opening %second_max_file%
start "" "%second_max_file%"
timeout /t 5 /nobreak >nul
) else (
echo No files found matching %numbers%
)
pause
这个也不好用……
欢迎大家帮忙。
最终我想要一个批处理文件,它可以做同样的事情,但我可以在其中输入图纸列表和配置编号,因此它将打开所有请求图纸的最后和倒数第二个修订版。 因此,如果有人也可以提供帮助,谢谢!
我也是批处理的新手,但也许我最近对
for
循环的尝试会有用。
虽然不完全清楚文件类型、目录深度或命名规则,但我整理了一些可能对您的工作有所帮助的东西。我承认我对你的变量使用有点怀疑(虽然可能只是我),所以我选择简化。
我使用了
notepad.exe
,虽然start
可以自动打开指定的文件扩展名,而且我通常也不会发现省略标题参数有任何问题。
@ECHO OFF
setlocal enabledelayedexpansion
set /P "userInputMapNo=Enter the map drawing no.:"
set /P "userInputConfNo=Enter the map configuration no.:"
for /F "tokens=1,2,3 delims=-" %%A in ('dir /S /O-N %userInputMapNo%-%userInputConfNo%-*') do (
call :mapSelection %%A %%B %%C
)
call :startMapTools
exit
:mapSelection
for %%a in ("%3") do (
if not defined workingRev (
set "workingRev=%1-%2-%3"
) else if not defined latestRev (
set "latestRev=%1-%2-%3"
)
)
exit /B
:startMapTools
start notepad.exe "!workingRev!"
start notepad.exe "!latestRev!"
exit /B
开始我们设置
setlocal enabledelayedexpansion
。这将允许我们使用在 for
循环中创建的变量。 %vars%
在运行 bat/cmd 之前被解析,因此这是启用延迟 !vars!
所必需的。有了这个,我们就进入了set /P
s.
在这种情况下,我们的
for
循环简单地使用了一个 dir
并且我们的 set /P
很容易成为通配符。 dir /O-N /B *-*-*
,/O-N
按name排序oorder(反转,“-”),/B
用于bare列表,输出:
0036255-003-001
0036255-002-005
0036255-002-004
0036255-002-003
0036255-002-002
0036255-001-009
0036255-001-008
我们在
for
循环中将其分解为 3 个由“-”分隔的单独标记:"tokens=1,2,3 delims=-"
。这给了我们%%A
、%%B
和%%C
,我们将它们传递给我们的:mapSelection
函数。所以假设我们的 %userInput...No%
变量分别是 00*
和 *2
,dir
将解析:
0036255-002-005
0036255-002-004
0036255-002-003
0036255-002-002
For
会将每个分隔符设置为一个变量,因此...
%%A=0036255
%%B=002
%%C=005
%%A=0036255
%%B=002
%%C=004
etc...
初始
for
的结果作为参数传递给:mapSelection
。然后我们在 %3
变量上运行一个循环,你想要最新和最好的。 dir
列表的选择非常简单,可以通过一些简单的 if
语句来完成。当循环出现在有序列表if not defined workingRev
上时,第一个值,set workingRev
,否则为if defined workingRev
,但第二个变量为not defined latestRev
,set latestRev
。该循环将解析提供的整个目录列表(由 %userInputs...No%
大幅缩小),为前两个设置变量,但忽略其余的。
然后我们以
:startMapTools
结束。这是最重要的部分,您可能会发现问题所在(尽管尾部空格和制表符同样令人沮丧)。对于 start
cmd 使用我们新创建的 for
!vars!
,这就是 setlocal
发挥作用的地方。 %vars%
将有奇怪的结果,在 for
循环之前被解析,并且必须使用延迟的 !vars!
,因此: start mapSoftware.exe !workingRev!
或 start mapSoftware.exe !latestRev!
.
我在没有扩展名的空白文件上使用记事本,但
dir
中的通配符(*)将接受任何。如果您有一个特定的扩展名,您可以将它硬编码到dir
,或者制作另一个set /P userInput...=
.
以上只是一个例子,但希望你能从中有所收获。您甚至可以将
/S
参数添加到 dir
cmd 以递归目录,但是以上不处理目录名称中的空格。并进一步警告,dir
进行自然顺序计数,但是您的前导零有助于规避该问题。
你的第一个问题,我的第一个答案
盲人领盲人,
祝你好运,
希望有帮助,
Zed