批量复制并添加到子文件夹

时间:2017-11-13 20:56:56

标签: batch-file

希望你能帮我解决这个问题,我无法让它成为我需要的工作

我需要从源文件夹中复制所有.pdf文件,创建一个名为“T-123456”的文件夹,并在目标文件夹中添加找到正确文件夹中的相应PDF文件,但有时候会输入名称它变化或参考变化“SM17-123”。

文件示例
HC002T-1234562436787004332
MV002T-1234562436787004332
PP _002_T-123456_24_3678_7004332

指导文件的类型
HC123CLG-32-172436787004259
HC123SM17-1802436787004044

我创建了这个代码,但是它成为了工作的一部分,因为名称变化并且创建文件夹对于那些文件不正确,有时文件在开始示例001或0001中有更多数字,所以我不知道如何省略其他引用文件,只有工作蒙特文件“T-123456”我也需要批量连续工作在源文件夹中创建的新文件,如果我有另一个路径,我有其他类型的文件,并复制到正确的参考,这将是伟大的

@echo off
title Electronic File

:loop
cls
timeout -t 1 >nul
color b
for %%A in (*.pdf) do (
   echo File Found %%A
   for /f "delims=" %%B in ("%%A") do set fname=%%~nB
   for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
   for /f "tokens=1* delims=" %%D in ("!fname:~5,8!") do set folname=%%D
   echo Name folder !folname!
   if not exist "!folname!" (
      echo Folder !folname! dont exist, creating
      md "!folname!" 2>nul
   ) else (
      echo Folder !folname! exists
   )
   echo Copying file %%A to folder !folname!
   xcopy "%%A" "!folname!"
   )

echo on

md "C:\test %All%"

xcopy /s /y "X:\test\pdf" "W:\Electronic File %All%"

goto :loop

pause

1 个答案:

答案 0 :(得分:0)

for %%A in (*.pdf) do (
   echo File Found %%A
   set fname=%%~nA
   set fextn=%%~xA
   set folname=!fname:~5,8!
   ECHO !folname!|FINDSTR /i /r "[A-Z]-[0-9][0-9][0-9][0-9][0-9][0-9]" >NUL
   IF ERRORLEVEL 1 (
    ECHO %%A - !folname! excluded
   ) ELSE (
    echo Name folder !folname!
    if not exist "!folname!" (
       echo Folder !folname! dont exist, creating
       ECHO md "!folname!" 2>nul
    ) else (
       echo Folder !folname! exists
    )
    echo Copying file %%A to folder !folname!
    ECHO xcopy "%%A" "!folname!"
   )
)

这是问题的关键。 delayedexpansion需要启用 - 您不会在原始代码中显示该内容。

请注意,%%B%%C%%D不需要在循环中,%%A包含文件名,因此您可以set该名称的变量。

请注意,fextn显然始终为.pdf,因为这是您在文件掩码*.pdf中指定的扩展名,因此设置它似乎是多余的。

语法SET "var=value"(其中value可以为空)可用于确保任何杂散尾随空格不包含在分配的值中。

我引入的更改是echo目录名为findstr/i不区分大小写/r errorlevel正则表达式,即一个字母,a破折号然后6个数字。如果目录名匹配,则0findstr设置为1,否则将设置为if errorlevel 1

echo表示“如果errorlevel为1或更高”,如果是,则匹配 UN 成功,因此报告文件名和提取的目录名;否则,请完成您的逻辑(我已将其更改为md xcopyfor %%A in (*.pdf) do ( echo File Found %%A set "copied=" set fname=%%~nA set fextn=%%~xA set folname=!fname:~5,8! ECHO !folname!|FINDSTR /i /r "[A-Z]-[0-9][0-9][0-9][0-9][0-9][0-9]" >NUL IF not ERRORLEVEL 1 call :process "%%A" rem repeat this section for each match required - begin if not defined copied ( set folname=!fname:~5,9! ECHO !folname!|FINDSTR /i /r "[A-Z][A-Z][A-Z]-[0-9][0-9]-[0-9][0-9]" >NUL IF not ERRORLEVEL 1 call :process "%%A" ) rem repeat this section for each match required - end if not defined copied ECHO %%A - !folname! excluded ) goto :eof :process echo Name folder %folname% if not exist "%folname%" ( echo Folder %folname% dont exist, creating ECHO md "%folname%" 2>nul ) else ( echo Folder %folname% exists ) echo Copying file %~1 to folder %folname% ECHO xcopy "%~1" "%folname%" set "copied=Y" goto :eof 命令,以进行测试。

鉴于我们现在有一个变量结构,

PP

在您的扩展示例中,不清楚set适合该方案的位置。

公式相当简单。起始位置是regex中的第一个参数(从第一个字符开始计算= 0),第二个参数是要选择的长度。 .匹配可以是单个字符(字面匹配)或[rangestart-rangeend] HC123CLG-32-172436787004259匹配任何一个字符,因此我显示的第一个块从CLG-32-17中选择9个字符的第5个字符(从0开始)= errorlevel并将其与alpha,alpha,alpha, - ,numeric,numeric, - ,numeric,numeric匹配。

在匹配项中,0设置为:process,因此call子例程为%%A,引号中的参数为folname。子例程使用%1中的值并复制文件(现在%~1中的名称 - regex删除引号)。

所以 - 它就像重复代码块一样简单,改变要选择的字符串的开始和长度,并更改function searchStrings(){ searchString('hello world'); searchString('Goodbye'); } RedactAddin.searchStrings = searchStrings; function searchString(input) { // Run a batch operation against the Word object model. Word.run(function (context) { //...... (same as the original) ............... 以适应所需的模式。