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
处理。此技术(echo
ing 命令)用于 显示 命令以便对其进行验证。请注意,我还特意插入了一对 rabbit's-ears (""
),因为 start
的第一个引用参数被视为 window-title.
我卡在了一段主要不是我自己写的代码上。我正在寻找一个贯穿所有文件的代码,扩展名为 .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
处理。此技术(echo
ing 命令)用于 显示 命令以便对其进行验证。请注意,我还特意插入了一对 rabbit's-ears (""
),因为 start
的第一个引用参数被视为 window-title.