Batch For loop ..通配符来确定搜索文件的长度?

Batch For loop.. wildcards to determine length of searched files?

我卡在了一段主要不是我自己写的代码上。我正在寻找一个贯穿所有文件的代码,扩展名为 .dwg,以 K_E 开头,长度为 9。我本能地使用了通配符,但这不起作用..

K_E??????.dwg 会在我脑海中发挥作用..但没有。

我需要这个长度的原因是在更深的文件夹中有 K_E??????xx.dwg 等文件。

子文件夹中的其他文件可以有一系列其他名称,一般的想法是我只想要完全命名的文件 K_E[insert 6numbershere].dwg 或者,或者文件夹的限制depth = 2。我还尝试了文件夹名称中的通配符,以允许代码仅在 2 个深层文件夹中查找 K_E*.dwg 文件,但这也没有用。像 C:\Users\b00m49\Desktop\LSPTEST**\K_E*.dwg 这样的东西也可以工作..

代码应该打开绘图,应用脚本,然后转到下一个文件。

这就是我目前正在使用的内容。

 for /r "C:\Users\b00m49\Desktop\LSPTEST" %%a in (K_E*.dwg) do ( start /wait "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr")

所以您只想排除名称中包含 backup 的文件?这应该有效:

@echo off
setlocal enabledelayedexpansion
for /r "C:\Users\b00m49\Desktop\LSPTEST" %%a in (K_E*.dwg) do (
    set filename=%%a
    if "!filename:backup=!"=="!filename!" (
        rem start /wait "C:\Program Files\Autodesk\Autocad 2013\acad.exe" "%%a" /b "C:\Users\b00m49\Desktop\LSPTEST\expSQM.scr"
    )
)
pause
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=C:\Users\b00m49\Desktop\LSPTEST"
SET "sourcedir=U:\sourcedir"
for /r "%sourcedir%" %%a in (K_E*.dwg) do (
 FOR /f "tokens=1,6delims=\" %%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

您需要更改 sourcedir 的设置以适合您的情况。我用了一个测试目录。

所需的 START 命令仅 ECHO 用于测试目的。 确认命令正确后,将ECHO(START更改为START以实际启动进程。

我不确定您所说的 "two levels down" 是什么意思 - 我假设目标目录有两个级别。由于您的实际目录比我的测试目录多 3 个级别,您可能需要将 1,6 更改为 1,9

只需使用标记化功能即可确保不超过 ?目录级别,其中驱动器名和文件名算作级别。有则忽略该文件。

然后获取名称 - 我们知道前 3 个字符是 K_E 但我们想要后面的 6 个字符,因此查看是否有字符 10+ 如果没有,请确保字符 9 存在 (字符从 0 开始计数),如果这两个条件都有效,那么它必须是 K_E*6characters*

如果需要,可以确保所有 6 个字符都是数字,但实际上没有指定。

顺便说一句 - 要添加信息,请将其编辑到您的问题中,这样人们就不需要追逐整个主题。


@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

这对我有用。

备注:

pause 行应该在 显示 要执行的命令后停止程序。

您需要在 sourcedir 的设置中将 U: 更改为 C: 才能让它处理您的 c: 驱动器。

您需要将 ECHO(start 更改为 start 才能真正执行 autocad 处理。此技术(echoing 命令)用于 显示 命令以便对其进行验证。请注意,我还特意插入了一对 rabbit's-ears (""),因为 start 的第一个引用参数被视为 window-title.