如何仅扫描EXACT文件名(通过批处理文件)? //如何从不同的子文件夹中复制(并保留)同名文件?

时间:2017-06-20 15:42:08

标签: windows batch-file findstr

我希望标题有点易于理解......

我想扫描一个大文件夹(包括子文件夹)以获取特定文件列表,并将它们复制到新位置。到目前为止,我已经找到了以下几行代码:

@echo off &setlocal 
set "sourceRoot=E:\source folder\" 
set "sourceList=list of file names.txt" 
set "destFolder=C:\destination folder\

for /f "delims=" %%i in ('dir /a:-d /b /s "%sourceRoot%\*.jpg"^|findstr /ig:"%sourceList%"') do ( 
  copy "%%~i" "%destFolder%\"
) 
PAUSE

这很好用,但自然会一直复制包含“sourceList”中一行的所有文件。 (例如,如果我要复制“saber.jpg”,它还会复制“light saber.jpg”和“sabertooth.jpg”) 我发现并尝试了像“^”和“$”或“/ b”和“/ e”这样的命令来告诉代码结果应该以搜索字符串开始和结束 - 但无济于事。 可悲的是,我没有任何编码知识,广泛的谷歌搜索没有让我比这更进一步。

有没有办法确保只复制名称为.txt文件整行的IDENTICAL的文件?

第二个问题:

在不同的子文件夹中,有些文件具有相同的名称(它们是相应文件的不同版本)。每当我运行代码时,它们似乎都会相互覆盖 - 为每个文件名留下一个版本。 理想情况下,我希望复制所有不同版本并为副本提供扩展名,以便它们可以共存于目标文件夹中。 (例如“saber”,“saber1”,“saber2”等)

我想提前感谢大家的帮助和想法! :)

亲切的问候

马尔特

(如果它以任何方式重要:我使用的是Windows 7)

2 个答案:

答案 0 :(得分:1)

这仅指第一个问题,但不是您在问题中提到的第二个问题!

鉴于文件list of file names.txt仅包含纯文件名但没有文件路径,/E搜索可以通过findstr选项锚定到每行的末尾,但它不能锚定到开头,因为您将绝对路径提供给/S而不是纯文件名,因为findstr在提供list of file names.txt选项时返回完整路径。

您可以做的是在\\之前的每个文件名前加findstr,这是... set "sourceList=list of file names.txt" set "tempList=%TEMP%\augmented list.tmp" ... > "%tempList%" ( for /F "usebackq delims= eol=|" %%L in ("%sourceList%") do ( echo(\\%%L ) ) ... 的转义字面反斜杠,而后者又是Windows路径分隔符。

findstr

然后调整您的管道/L命令行(添加 dir /A:-D /B /S "%sourceRoot%\*.jpg" ^| findstr /L /I /E /G:"augmented list.tmp" 以强制文字搜索):

...
del "%tempList%"

最后,完成复制后,清理临时列表文件:

    <?xml version='1.0' encoding='UTF-8'?>
    <wd:Report_Data 
    xmlns:wd="urn:com.workday.report/CIS_CR_INT122_HMS_Dependent_Report"> 
    <wd:Report_Entry>
    <wd:Dependents>
     <wd:project_id>2269</wd:project_id>
     <wd:plan_id>5909</wd:plan_id>
     <wd:employee_client_id>JA5637</wd:employee_client_id>
    </wd:Dependents>
    </wd:Report_Entry> 
    <wd:Report_Entry>
        <wd:Dependents>
              <wd:project_id>2269</wd:project_id>
              <wd:plan_id>5909</wd:plan_id>
              <wd:employee_client_id>JA4345</wd:employee_client_id>
        </wd:Dependents>
     </wd:Report_Entry>
     <wd:Report_Entry>
        <wd:Dependents>
              <wd:project_id>2269</wd:project_id>
              <wd:plan_id>5909</wd:plan_id>
              <wd:employee_client_id>JA5637</wd:employee_client_id>
         </wd:Dependents>
         </wd:Report_Entry>
         </wd:Report_Data>

答案 1 :(得分:0)

第一个问题:

/b

代替exact match等,意味着findstr /?

(请参阅提示中的copy "%%~i" "%destFolder%\"

第二个问题:

而不是if exist "%destFolder%\%%i" ( set "copied=" for /L %%c in (2,1,7000) do if not defined copied if not exist ""%destFolder%\%%~ni%%%c%~xi" copy "%%~i" "%destFolder%\%%~ni%%%c%~xi"&set "copied=Y" ) else ( copy "%%~i" "%destFolder%\" )

copied

首先,查看原始目标文件名是否存在。如果没有,请复制该文件。

如果是,请清除标志值%%c,并循环copied = 2到7000步骤1 :(如果未设置copied标志且文件名为basename %% c.extension不存在,然后复制到basename %% c.extension并设置为将for标记为值)

for /? 文档

%%~ni
来自提示符的

将显示元变量修饰符是什么(%%i = %%~xi的名称部分,%%c =扩展部分等等。)if defined是只是一个带有递增数值的字符串。

请注意 try{ Config conf = new Config(); conf.useSingleServer().setTimeout(3600000); conf.useSingleServer().setRetryInterval(3600000); conf.useSingleServer().setAddress("redis://127.0.0.1:6379"); RedissonClient redisson = Redisson.create(conf); RMap<String,Object> map = redisson.getMap("myCache"); MyClass myObject; // This is the big complex object. map.put("key", myObject); redisson.shutdown(); }catch (Exception ex) { ex.printStackTrace(); } 对变量的运行时值进行操作,以便它可以作为标志。