【问题标题】:XCopy to path with a prompt and wildcardXCopy 到带有提示符和通配符的路径
【发布时间】:2019-08-09 10:18:02
【问题描述】:

我想重新利用批处理文件,最新的限制是目标位置的目录具有唯一标识符和描述。我需要提示输入唯一标识符并使​​用通配符绕过描述。例如“\serverB\dest\ID - 描述\DIR1\DIR2\

set DEST="\\serverB\Dest"
set /p UNIQUE ID=Enter ID
echo %UNIQUE_ID%
>NULL xcopy "\\serverA\source\something\file.txt" "%DEST%\%UNIQUE_ID% *\DIR1\DIR2" /i /y

以前我没有这个问题,所以长目录名不是问题。现在我需要绕过最终组件,因为目录在描述中不一致。一旦我通过了具有唯一 ID\Desc 的目录,其余子目录将保持一致。

set DEST="\\serverB\Dest"
set /p UNIQUE ID=Enter ID
echo %UNIQUE_ID%
>NULL xcopy "\\serverA\source\something\file.txt" "%DEST%\%UNIQUE_ID% *\DIR1\DIR2"

我得到了无效的驱动器规格作为错误。

我也不从事 IT 工作或以编码为生,因此请对任何回应保持温和。

【问题讨论】:

    标签: batch-file cmd wildcard copying


    【解决方案1】:

    您不能在目录名称中使用 File Glob,除非您只是想匹配一个目录名称,这在 Windows 可执行文件中是相当一致的。

    相反,您可以使用 FOR 循环来匹配目录名称,使用 File Glob 作为目录名称,然后将其保存到变量中并在您的 XCOPY 命令中使用。

    @(
      ECHO OFF
      SETLOCAL
      SET "_Src_FilePath=\\serverA\source\something\file.txt"
      SET "_DstPath_Prefix=\\serverB\Dest"
      SET "_DstPath_Postfix=\DIR1\DIR2"
    )
    
    SET /P "_UNIQUE_ID=Enter ID: "
    IF NOT DEFINED _UNIQUE_ID (
       ECHO. Exiting, you did not provide a Unique ID!
       GOTO :EOF
    )
    ECHO.ID Provided: "%_UNIQUE_ID%"
    
    REM Get matching Director(y|ies) and copy file(s):
    
    FOR /F "Tokens=*" %%D IN ('
      DIR /AD /B "%_DstPath_Prefix%\%_UNIQUE_ID% *"
    ') DO (
      ECHO.Matched Directory: "%%D" - Running Copy to: "%_DstPath_Prefix%\%%D%_DstPath_Postfix%"
      >NULL xcopy "%_Src_FilePath%" "%_DstPath_Prefix%\%%D%_DstPath_Postfix%"
    )
    

    【讨论】:

    • 感谢以上内容,一旦我弄清楚了一些事情,它就工作得很好。我还没有完全接受我需要做的事情。基本上我有一系列命令,可以从 xcopy、mkdir、重命名、删除等执行任何操作。公共目录是源和目标。一旦目录匹配,这个可以变成一个变量吗?即做一次并参考它继续前进?例如可以将%%D 转换为%DEST%,关闭命令然后使用下面的xcopy 和其他命令吗?我不知道这是否可以完成,我只是无法使用其他一些 cmds 让它工作
    • @3rutu5 是的!实际上,您可以将目录名称设置为变量并稍后使用它,但是它会将变量设置为找到的最后一个匹配项(或首先使用 if 逻辑,或者您可以在变量中收集匹配项列表,但随后您稍后仍需要循环它们以针对每个运行命令
    • @3rutu5 或者,您可以将所有命令放在循环内运行,或者让循环调用子函数为每个匹配运行进一步的命令
    • 对于上述内容,我最终将 unique_id 提示更改为 Setlocal 列表中指定的另一个提示,然后我可以在批处理中的其他项目中引用它。如果 Unique_ID 提供了在下面的目录查找中使用的提示,我会让 %%d 运行它的过程并在 echo.matched 目录下然后执行 set P=%DEST%?,然后可以替换进入 xcopy 和下面的其他任务?如果可以的话,我更愿意将它设置在 setlocal 下的顶部,然后在 .bat 中使用它,从我在您的回复中看到的我可以吗?不知道你有一个例子吗?
    • @3rutu5 >>如果可以实现我在其他答案中提到的内容,我会很感兴趣。即,如果我手动输入一些东西,我可以在另一个变量中使用前 2 个数字而不输入它吗?我在想如果我输入 AA-BBB 它会存储为 %Unique_ID% 并且可以仅使用 AA 部分(通常是年份)创建另一个变量 – 3rutu5 8 月 14 日 6:00
    【解决方案2】:

    您不能在路径中间使用wildcards,它们只能在最后一个路径元素中使用。

    要解决这个问题,您可以使用 for /D loop 来解析通配符:

    set "DEST=\\serverB\Dest"
    :LOOP
    set /P UNIQUE_ID="Enter ID: " || goto :LOOP
    echo %UNIQUE_ID%
    for /D %%D in ("%DEST%\%UNIQUE_ID% *") do (
        > nul xcopy "\\serverA\source\something\file.txt" "%%~D\DIR1\DIR2"
    )
    

    还有一些进一步的改变:

    • 引用的set 语法已被应用,因此引号不再成为分配值的一部分(见第一行);
    • 一个错字已修正,提示变量名为UNIQUE_ID,但不是UNIQUE ID
    • 演示了如何使用conditional execution检测用户是否在Enter ID提示符中输入了内容;
    • Windows 中的 null 设备称为 nul 但不是 null

    【讨论】:

    • 谢谢。修改后的代码是否允许我在批处理中进一步使用 %%~D 用于其他命令?我想我需要这样做,因为我刚刚注意到我在附加脚本中也使用了这个目录,这是批处理触发的。抱歉,我是一名 AutoCAD 绘图员,这将复制清单并将一些特定于作业的脚本运行到绘图中。它可能比它需要的更复杂,但是几年前写的,我忘记了它最初是如何完成的
    • 以前的工作场所有一个相当标准的目录设置,但是这个有一个唯一的编号和描述,这让我有些悲伤。在我设置/p 并提示输入项目编号之前,它将在下面替换它。我仍然通过在 unique_id 中提升然后使用 set 变量来部分地做到这一点。如果我可以使用“匹配”目录作为另一个变量,我可以让这个过程向前排序。
    • 不客气! %%~D 只能在循环上下文中使用,因此在 do 之后的括号内;但由于应该只有一个匹配的目录(据我了解),您可以在循环中执行 set "MATCHED=%%~D" 并在脚本的其他地方使用变量 %MATCHED%...
    • 今晚我会试一试,但我认为这正是我所追求的 :) 非常感谢大家的帮助,非常感谢
    • 很高兴为您服务!请考虑为有用的答案投票,并接受让您完全满意的答案!阅读this help article 为什么这很重要!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多