【问题标题】:Batch For loop.. wildcards to determine length of searched files?批处理循环..通配符确定搜索文件的长度?
【发布时间】:2016-03-09 08:37:14
【问题描述】:

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

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

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

子文件夹中的其他文件可以有一系列其他名称,一般的想法是我只想要完全命名为 K_E[insert 6numbershere].dwg 的文件,或者文件夹深度的限制 = 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")

【问题讨论】:

    标签: loops batch-file for-loop wildcard


    【解决方案1】:

    所以您只想排除名称中包含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
    

    【讨论】:

    • 不。我应该对你们更直接。这里的第一个问题。子文件夹中的其他文件可以有一系列其他名称,一般的想法是我只想要完全命名为 K_E[insert 6numbershere].dwg 的文件,或者文件夹深度的限制 = 2。我也尝试了通配符在文件夹名称中以允许代码仅在 2 个深层文件夹中查找 K_E*.dwg 文件,但这也不起作用。像 C:\Users\b00m49\Desktop\LSPTEST**\K_E*.dwg 之类的东西也可以工作..因为其他名称只出现在更深的文件夹中..谢谢你的回复!!
    【解决方案2】:
    @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 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(START更改为START以实际启动进程。

    我不确定您所说的“向下两层”是什么意思 - 我假设目标目录 + 两层。由于您的实际目录比我的测试目录多 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 命令)用于显示 命令以对其进行验证。请注意,我还特意插入了一对兔耳朵 (""),因为 start 的第一个引用参数被视为窗口标题。

    【讨论】:

    • 非常感谢您的帮助。我会尽我所能理解你输入的内容。这个主题是新的。 "" cmets 之间的项目是什么?我应该删除那些代码才能工作吗?我不认为我理解“只有 0、1 或 2 级以下为空”.. 这一切看起来都很合乎逻辑,但我对所有这些命令都很陌生,我不确定我是否可以修改它。将尝试对此进行一些实验。再次,非常感谢!
    • 我现在明白 REM 是 cmets.. 那么我应该如何更改 sourcedir 的设置呢?我没有看到你的测试目录..我应该删除行 SET "sourcedir=U:\sourcedir" 吗?
    • 是的 - 只是当前选择了我的测试目录。您还需要将 1,6 更改为 1,9,因为您指定的目录还有 3 个级别。
    • 好的。我按照你说的编辑了代码。批次立即打开和关闭。我将这些值更改为 6、7、8、9,但这并不能解决问题。可能是关于长度的东西?该文件的文件夹结构如下: C:\Users\b00m49\Desktop\LSPTEST\0031\00\K_E000031.dwg 。所以我在计算反斜杠来确定分隔符的数量.. 什么都没有:/
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多