原始文件夹中的文件重复

时间:2018-08-06 11:32:18

标签: batch-file

我有此批处理文件,该文件复制了我的文件夹和子文件夹中的所有.jpg文件,并在末尾用-Copy重命名了它们。问题是我需要将重复的jpg与原始jpg放在同一文件夹中创建,我复制的脚本将其复制到批处理文件所在的目录中。这是文件:

for /R %%f in (*.jpg) do copy "%%~f" "%%~nf - Copy%%~xf"

此刻运行脚本会发生什么-您会看到1-copy.jpg2-copy.jpg与批处理文件位于同一文件夹中。

Images/
├── batchfile.bat
│   1-Copy.jpg
│   2-Copy.jpg
├── Folder1/
│   ├── 1.jpg
├── Folder2/
│   ├── 2.jpg

我要做的是将1-copy.jpg2-copy.jpg与原始jpg放在同一文件夹中。如下所示。

Images/
├── batchfile.bat
├── Folder1/
│   ├── 1.jpg
│   ├── 1-Copy.jpg
├── Folder2/
│   ├── 2.jpg
│   ├── 2-Copy.jpg

1 个答案:

答案 0 :(得分:2)

解决方案似乎非常简单:目标文件的引用是源文件的驱动器和路径。但这不是那么简单,因为应该避免在每次执行批处理文件时一次又一次复制* - Copy.jpg并在文件名后附加 - Copy来复制I。因此,有必要过滤掉所有已经以该字符串结尾的JPEG文件名。

此处最好使用f而不是f作为循环变量,尽管也可以使用f以避免与修饰符for /F "delims=" %%I in ('dir *.jpg /A-D-H /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /L /V /C:" - Copy.jpg"') do copy /B /Y "%%I" "%%~dpnI - Copy%%~xI" 混淆(完全限定)文件/文件夹名称)。

cmd.exe /C

FOR 在后台以dir *.jpg /A-D-H /B /S 2>nul | C:\Windows\System32\findstr.exe /E /I /L /V /C:" - Copy.jpg" 开头的命令行中执行单独的命令过程:

|

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul|的解释。重定向操作符>^必须用 FOR 命令行上的脱字符号*.jpg进行转义,以在Windows命令解释器处理此命令行时将其解释为原义字符。在执行命令 FOR 之前,该命令将在后台启动的单独命令进程中执行嵌入式命令行。

DIR 搜索

    由于/A-D-H
  • 未隐藏的/S 文件(属性不是目录,也不是隐藏的)
  • 由于/B在当前目录和所有子目录中
  • 并且由于选项/S而以裸格式输出,因为所有找到的文件的/E都是带有完整路径的文件扩展名。

DIR 编写的用于处理 STDOUT 的输出将重定向到处理命令 FINDSTR STDIN 。逐行列出。 FINDSTR 搜索

  • 由于/I而在每行末尾
  • 由于/L而不区分大小写
  • 并且从字面上是因为 - Copy.jpg(在这种情况下实际上并不需要)
  • 用于字符串/V
  • 由于I输出取反的结果,这意味着所有以该字符串结尾的行 not 以处理 STDOUT

FOR 捕获写入到 STDOUT 的所有内容,并逐行处理。空行和以分号开头的行将被 FOR 跳过,但是这种情况下不存在。 FOR 将在空格/制表符上拆分一行,并将仅第一个子字符串分配给循环变量"delims"。通过使用选项"%%I"(定义了一个空的定界符列表),可以禁用此字符串拆分行为。

由于 DIR 可以在此处仅用copy /?来指定源文件,因为 DIR 会输出找到的JPEG文件的名称,这些文件的总路径始终不带双引号引起来。因此,永远不需要删除周围的双引号。

具有单个命令行的批处理文件还可以在FAT32和ExFAT驱动器上工作,因为它处理的是捕获的文件名列表,而不是直接处理文件分配表中的* .jpg文件条目,该条目在每次JPEG文件复制后都会更改。 / p>

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • {{1}}