通过具有任何特定模式的文件夹

Pass through folder with any specific pattern

我有一个批处理脚本,它只能根据用户输入的代码复制 pdf 文件。一旦他们按下回车键,它就会寻找一个与输入代码具有相同文件名的文件夹。如果存在,它将复制里面的 pdf 文件。

现在我遇到了一个问题,因为在一个子文件夹中,它的文件名没有标准文件名。

比如 ex :有时它的文件名是 UV DATA 其他的是 UV-DATA , UV

pdf 文件的示例文件夹结构存储:

server
'----22050-022
     '----Folder1
               22050-022-DATA.pdf

示例文件夹目标:

server2
'----Folder
     '----22050-022
          '----UV DATA
               '----DOCUMENTS

UV DATA 文件夹是唯一发生变化的文件夹。 我怎样才能只设置 UV 而第二个字是任何特定的模式?

XCopy 示例,如果它是静态代码,默认文件名是 UV DATA:

set /p code=Input Control Number:

xcopy "%MySetPath%\Folder\%code%\%code%-DATA.pdf" "%MySetDestination%\Folder1\%code%\UV DATA\DOCUMENTS\" /D /E /C /I /Y /H

我只试过这样的方法但没有用:

set /p code=Input Control Number:

xcopy "%MySetPath%\Folder\%code%\%code%-DATA.pdf" "%MySetDestination%\Folder1\%code%\UV*.*\DOCUMENTS\" /D /E /C /I /Y /H

文件夹中的通配符在xcopy

等操作中不受支持

这个使用 FOR /F 的解决方案有点老套,但绝对有效:

@echo off
set /p "code=Input Control Number:"
for /f "tokens=* delims= " %%a in ('dir /b /ad "%MySetDestination%\Folder1\%code%\UV*"') (
xcopy "%MySetPath%\Folder\%code%\%code%-DATA.pdf" "%MySetDestination%\Folder1\%code%\UV-%%a\DOCUMENTS\" /D /E /C /I /Y /H
)

这会将文件以 UV<ANYTHING HERE>

格式复制到所有文件夹

试一试。您需要在下面设置源路径和目标路径以确保您具有最佳搜索级别,但是由于使用了 dir /s,您可以转到源路径和目标路径的最低级别:

@echo off
:start
set /p "code=Input Control Number: "
set "source=%HOMEPATH%\%code%"
set "destination=%HOMEPATH%\folder"
if "%code%" == "" echo Please input a valid Control number & goto start 
for /f "delims=" %%i in ('dir /b /a-d /s "%source%" ^| findstr /i "%code%" ^| findstr /i "pdf"') do for /f "delims=" %%a in ('dir /b /s /ad "%destination%" ^| findstr /i "%code%" ^| findstr /i "UV" ^| findstr /i "Documents"') do (
    echo "%%a"
    echo xcopy "%%~i" "%%~a" "/D /E /C /I /Y /H
)
@echo off
setlocal

rem Change current directory to HOMEDRIVE.
cd /d "%HOMEDRIVE%" || (
    >&2 echo Failed to change directory to "%HOMEDRIVE%"
    exit /b 1
)

rem Get the control number i.e. 22050-022.
set /p "code=Input Control Number: " || exit /b 0

rem Set initial source path and destination path here.
@rem Note: destination path without trailing "\UV*\DOCUMENTS".
set "source=%HOMEPATH%\%code%\Folder1\%code%-DATA.pdf"
set "destination=%HOMEPATH%\Folder\%code%"

rem Check initial source path.
if not exist "%source%" (
    >&2 echo Initial source path "%source%" not exist.
    exit /b 1
)

rem Check initial destination path.
if not exist "%destination%" (
    >&2 echo Initial destination path "%destination%" not exist.
    exit /b 1
)

rem Get "%%destination%%\UV*\DOCUMENTS\" path.
(
    set "destination="

    for /d %%A in ("%destination%\UV*") do if not defined destination (
        @rem Force an echo on line break.
        if exist "%%~A\DOCUMENTS\" set "destination=%%~A\DOCUMENTS\"
    )

    if not defined destination (
        >&2 echo Failed to get destination from "%destination%".
        exit /b 1
    )
)

rem Copy file from source to destination if file date is newer.
xcopy /d /y "%source%" "%destination%"
exit /b 0

这将尝试找到目标路径 UV* 在 OP 中指定的路径中和 评论我的理解。

将目录更改为 %HOMEDRIVE% 其他路径 以 %HOMEPATH% 开头可能无效,如果 当前目录在另一个驱动器上。 如果您使用镜像 %HOMEPATH% 的驱动器 那么您可以禁用目录更改为 留在那个驱动器上。

目标路径解析为 DOCUMENTS 文件夹,否则 destination 变量将被检测为未定义。

已完成检查以确保初始来源 并且目标路径存在。

由于只复制了 1 个文件,使用 xcopy 个适用于 1 个文件的参数。 看看我说的对不对

要了解代码的作用,请设置 @echo off@echo on 行进行测试。