我有此批处理文件,该文件复制了我的文件夹和子文件夹中的所有.jpg文件,并在末尾用-Copy
重命名了它们。问题是我需要将重复的jpg与原始jpg放在同一文件夹中创建,我复制的脚本将其复制到批处理文件所在的目录中。这是文件:
for /R %%f in (*.jpg) do copy "%%~f" "%%~nf - Copy%%~xf"
此刻运行脚本会发生什么-您会看到1-copy.jpg
和2-copy.jpg
与批处理文件位于同一文件夹中。
Images/
├── batchfile.bat
│ 1-Copy.jpg
│ 2-Copy.jpg
├── Folder1/
│ ├── 1.jpg
├── Folder2/
│ ├── 2.jpg
我要做的是将1-copy.jpg
和2-copy.jpg
与原始jpg放在同一文件夹中。如下所示。
Images/
├── batchfile.bat
├── Folder1/
│ ├── 1.jpg
│ ├── 1-Copy.jpg
├── Folder2/
│ ├── 2.jpg
│ ├── 2-Copy.jpg
答案 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 /?