我想知道是否可以设置批处理命令来执行此操作。
执行.bat文件后,文件夹和子文件夹中的所有图像都将复制到我桌面上的位置。
实施例: 原始文件夹位于: \ intranet \ file_location \ PP完整图像(在此文件夹中将加载其他文件夹,在这些文件夹中将有.jpg图像)
目标文件将基于桌面。
所以我需要从所有文件夹和子文件夹中提取.jpg图像。
如果图像已存在于原始文件夹中,则跳过图像或覆盖,因为脚本将每天早上执行。
或者我应该找一个软件为我做这个吗?
现有代码:
cd c:
cd\
copy "\\intranet\PP Complete Images\Master Image Folder*.jpg" "C:\Users\username\Desktop\Master Image Folder"
copy "\\intranet\PP Complete Images*.jpg"
exit
答案 0 :(得分:1)
我不太清楚,结果究竟应该如何 - 它应该展平还是它应该是分层的?
请看这个例子:
source
folder-1
folder-1-1
image1.jpg
folder-1-2
image2.jpg
cheese.jpg
image3.jpg
some_text.txt
folder-2
folder-2-1
image3.jpg
some_music.mp3
cheese.jpg
target
结果应该基本上是所显示层次结构的副本(没有除 jpg 之外的任何其他文件),或者应该是像这样的 flattened 结果:
source
... (see above)
target
image1.jpg
image2.jpg
cheese.jpg
image3.jpg
image3.jpg
您可以使用DOS'for
命令遍历目录 1 并创建自定义函数 2 来处理文件:
@ECHO OFF
for /r %%f in (*.jpg) do call:copyFile %%f
GOTO END
:copyFile
copy /V /-Y %~1 ..\target
GOTO:EOF
:END
含义:for
来自当前工作目录的%%f
列表中的每个*.jpg
,执行函数copyFile
。 /r
开关使列表重复(遍历所有子目录)。
在函数中,传递给它的参数(现在称为%~1
)被传递给复制函数:在这种情况下,将文件复制到目标目录..\target
。 /V
允许复制验证结果,/-Y
让它请求覆盖文件的权限。见copy /?
!
非常大的问题:如果您的源目录的不同子文件夹中有一个或多个文件具有相同的名称(例如我的示例中的两个cheese.jpg
),< strong>你会丢失数据!
所以,我不推荐这种方法,因为你冒着丢失数据的风险(数码相机在命名图片方面不是很有创意!)。
只需使用robocopy
:
robocopy /S <sourcedir> <targetdir> *.jpg
/S
也会创建和复制子文件夹。您还可以使用/DCOPY:T
使目录具有与原始目录相同的时间戳,或使用/L
来预览robocopy的操作。
小问题:/E
开关也处理子文件夹,即使它们是空的。 /S
也会处理子文件夹,但如果它们是空的,则不会。 但它处理它们,如果它们不是空的,但内部没有JPG - 那么,没有JPG的子文件夹将导致目标文件夹中的空文件夹。
Robocopy有很多参数,因此请查看robocopy /?
。
希望这有帮助! : - )
1 在此处找到:How to traverse folder tree/subtrees in a windows batch file?
2 在此处找到:http://www.dostips.com/DtTutoFunctions.php
答案 1 :(得分:0)
我相信你问题的解决方案是Robocopy。 Robocopy简直太棒了!
以下是robocopy的语法 -
robocopy [来源] [目的地] [文件] [...] [选项]
<强>来源 指定源文件夹。你想从哪里拿文件。
目标强> 目的地目录/文件夹。
文件强> 我们到了!这对你有所帮助。您可以在此处指定要移动的扩展程序。所以在你的情况下,你的代码看起来会像这样。
robocopy *.jpg c:\destinationdir /S /MAX:1048576
*每天早上执行这个.bat去一个叫做任务调度程序的程序,别担心,它内置于windows中。 http://windows.microsoft.com/en-US/windows/schedule-task#1TC=windows-7
*然后点击创建基本任务,并随时将您的任务设置为!
答案 2 :(得分:0)
您现有的代码:
cd c:
不正确。要将当前驱动器切换到c:
,请使用
c:
cd \
是多余的。您剩下的代码指定了目录,因此当前目录无关紧要。
您的第一个copy
命令有三个问题。 Master Image Folder*.jpg
表示所有文件名以Master Image Folder
开头,结尾为.jpg
。您可能认为Master Image Folder\*.jpg
表示.jpg
...\Master Image Folder\
结尾的文件
C:\Users\username\Deskto...
可能是错误的。这是一个文字路径,因此实际目录为C:\Users\username\Deskto...
您可能需要C:\Users\%username%\Deskto...
替换当前username
。
然后作业将停止在文件名匹配上,因此您要按A
覆盖全部,或者您要按y
或n
来表示每个名称-match。
您的最终copy
命令没有指定的目标目录。
您可以edit
- 在实际代码中使用原始文本窗口下的edit
按钮,剪切并粘贴您的实际代码 - 必要时进行审查,选择结果代码块并按下编辑框上方的{}
按钮,该按钮会对每行进行缩进,并具有格式化和高亮显示代码的效果。
最简单的解决方案可能是使用
xcopy /d /y /s "\\intranet\PP Complete Images\Master Image Folder\*.jpg" "C:\Users\%username%\Desktop\Master Image Folder\"
将使用自动覆盖(/ y)复制更新的文件(/ d),并从名称/掩码到目录扫描子目录(/ s)。
这将在destop的Master Image Folder
目录下创建与原始子树相同的目录层次结构。
您可以将此扩展到
for %%a in (
"\\intranet\PP Complete Images\Master Image Folder"
"\\intranet\wherever\somewhere"
) do xcopy /d /y /s "%~a\*.jpg" "C:\Users\%username%\Desktop\Master Image Folder\"
对多个目录子树执行相同的操作;但是你需要确保目标目录不在选择包含在括号内的列表中的任何子树中。
我建议不要“扁平化”输出,因为如果你这样做,每个子树中最新的任何 .jpg将最终出现在目标目录中,而不会通知有很多可能不同的任何 .jpg版本。
答案 3 :(得分:0)
谢谢你们的帮助!!!
我得到了解决,如果有人需要类似的东西,下面有一个代码:
pushd Z:\intranet\PP Complete Images\
for /r %%a in (*.jpg) do (
XCOPY /Y "%%a" "C:\Users\username\Desktop\Master Image Folder"
)
popd