寻找批处理文件以打开两个特定文件

问题描述 投票:0回答:1

我想写一个批处理文件来查找给定图纸和配置的最新版本

扫描地图和脚本找到最新修订版时,我希望脚本打开最新修订版和倒数第二个修订版。

例如,在地图中我有

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

这个也不好用……

欢迎大家帮忙。

最终我想要一个批处理文件,它可以做同样的事情,但我可以在其中输入图纸列表和配置编号,因此它将打开所有请求图纸的最后和倒数第二个修订版。 因此,如果有人也可以提供帮助,谢谢!

batch-file
1个回答
0
投票

我也是批处理的新手,但也许我最近对

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

© www.soinside.com 2019 - 2024. All rights reserved.