【问题标题】:Batch-Loop that opens fixed length filenames in subdirectories在子目录中打开固定长度文件名的批处理循环
【发布时间】:2016-03-10 08:50:41
【问题描述】:

我在编写代码方面已经走了这么远(在你们的帮助下here),但它并没有做它应该做的事情..

批处理的目标是打开所有 K_E*.dwg 文件并在这些文件上执行脚本。 K_E*.dwg 文件的长度应为 9。例如 K_E123456.dwg。

到目前为止,这段代码打开了一个dos窗口并再次关闭它.. 我的文件夹结构是这样的:

C:\Users\b00m49\Desktop\LSPTEST\0031\00\K_E000031.dwg

C:\Users\b00m49\Desktop\LSPTEST\0031\01\K_E010031.dwg

C:\Users\b00m49\Desktop\LSPTEST\0032\00\K_E000032.dwg

C:\Users\b00m49\Desktop\LSPTEST\0033\00\K_E000033.dwg ...

运行此代码的任何帮助都会很棒..

我对批处理非常陌生,所以对步骤的解释可能很方便,并且可能让我解决小问题。

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=C:\Users\b00m49\Desktop\LSPTEST"
for /r "%sourcedir%" %%a in (K_E*.dwg) do (
 FOR /f "tokens=1,9delims=\" %%m IN ("%%a") DO (
  REM %%n contain dirname or filename or empty
  REM %%n is only empty for 0, 1 or 2 levels down.
  IF "%%n"=="" (
   SET "name=%%~na"
   IF "!name:~9!"=="" IF "!name:~8!" neq "" (
    REM the name is not longer than 9 characters, but IS longer than 8
     ECHO(start /wait "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr")
   )
  )
 )
)
GOTO :EOF

【问题讨论】:

    标签: batch-file for-loop


    【解决方案1】:

    您可以改用这种方法,它可以更好地识别所需的文件名:

    @echo off
    setlocal
    
    set "sourcedir=C:\Users\b00m49\Desktop\LSPTEST"
    cd "%sourcedir%"
    for /F "delims=" %%a in ('dir /S /B K_E*.dwg ^| findstr "\\K_E[0-9][0-9][0-9][0-9][0-9][0-9]\.dwg"') do (
       ECHO start /wait "" "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr"
    )
    

    for /r "%sourcedir%" %%a 命令替换为cd "%sourcedir%" 和后面的dir /S 命令;此方法处理相同的文件:源目录内任何级别的所有文件。文件列表通过| 管道传递到findstr filter 命令,该命令允许精确地传递那些具有“\K_E”+6 位数字+“.dwg”的名称。有关详细信息,请键入 findstr /?。输出由for /F "delims=" %%a 命令获取。

    PS - 为什么你使用start /wait 命令?其实际效果与单独执行acad.exe 命令相同...

    【讨论】:

    • 非常感谢。将使它发挥作用。看起来很棒。这是否也将自身限制为 2 个文件夹深?我可以以某种方式结合您和我的旧代码吗?因为有时有人将 K_Exxxxxx.dwg 放在更深的子目录中,这在我之前的代码中被忽略了。再次,非常感谢你..
    • 也感谢您的解释。我不知道为什么以前帮助过我的人使用了 start/wait 命令,但我并不真正了解这里使用的所有功能,所以我认为它是正确的。它似乎工作..但用户 Magoo 也纠正了这个错误,我会调查的。谢谢!
    【解决方案2】:

    我是这个网站的新手,没有注意到有人将他的评论编辑成有效的东西..

    我不完全明白怎么做,但这里是代码。

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "sourcedir=U:\Users\b00m49\Desktop\LSPTEST"
    for /r "%sourcedir%" %%a in (K_E*.dwg) do (
     FOR /f "tokens=1,9delims=\" %%m IN ("%%a") DO (
      REM %%n contain dirname or filename or empty
      REM %%n is only empty for 0, 1 or 2 levels down.
      IF "%%n"=="" (
       SET "name=%%~na"
       IF "!name:~9!"=="" IF "!name:~8!" neq "" (
        REM the name is not longer than 9 characters, but IS longer than 8
         ECHO(start /wait "" "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr")
       )
      )
     )
    )
    pause
    GOTO :EOF
    

    【讨论】:

    • 所以唯一的区别是""start /WAIT 之后,对吧? start 通常将第一个引用的字符串解释为窗口标题而不是可执行文件的路径,因此 "" 给出一个空标题...
    【解决方案3】:

    改变

     ECHO(start /wait "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr")
    

     start /wait "" "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr")
    

    或到

     start "" "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr")
    

    应该并行运行所有转换。

    【讨论】:

    • 谢谢。我将对此进行测试。并行转换,这是否意味着它将打开多个 AutoCAD 实例来运行脚本?因为我不认为我的电脑可以处理。最好小心我不完全理解的代码:) 再次感谢您在过去几个问题中的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多