【问题标题】:Command Promp to copy ONLY images from FOLDERS and SUBFOLDERS命令提示符仅从 FOLDERS 和 SUBFOLDERS 复制图像
【发布时间】:2015-01-14 13:47:12
【问题描述】:

我想知道是否可以设置一个批处理命令来执行此操作。

执行 .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

【问题讨论】:

  • 到目前为止,你有没有写过可以分享的代码?
  • 是的,但仅当 .jpg 文件在一个文件夹中时才会复制: cd c: cd\ copy "\\intranet\PP Complete Images\Master Image Folder*.jpg" "C:\Users \username\Desktop\Master Image Folder" 复制 "\\intranet\PP Complete Images*.jpg" 退出

标签: batch-file command-line command command-prompt command-line-interface


【解决方案1】:

谢谢大家的帮助!!!

我已经解决了,如果有人需要类似的东西,下面有一个代码:

    pushd Z:\intranet\PP Complete Images\
   for /r %%a in (*.jpg) do (
      XCOPY /Y "%%a" "C:\Users\username\Desktop\Master Image Folder"
   )
popd

【讨论】:

    【解决方案2】:

    您现有的代码:

    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 覆盖所有内容,或者为每个名称匹配按 yn

    您的最终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\"
    

    对多个目录子树执行相同的操作;但您需要确保目标目录不在括号内选择包含在列表中的任何子树中。

    我建议不要“展平”输出,因为如果这样做,每个子树中的最新 whatever.jpg 将最终出现在您的目标目录中,而不会通知您有很多可能不同的 whatever.jpg 版本。

    【讨论】:

    • 事情是文件夹和子文件夹中的所有图像都是唯一的,所以我不担心复制它们......问题是我无法在共享文件夹上运行批处理文件所以它有成为我的本地机器...
    • 我已将代码合并到此:@ECHO OFF for /r %%f in ("\\intranet\PP Complete Images") do call:copyFile %%f GOTO END :copyFile copy /V %~1 C:\Users\username\Desktop\test GOTO:EOF:END 但我只需要提取 .jpg 文件,它实际上正在提取所有内容,并且仅从 40k+ 图像中提取 24 个项目
    【解决方案3】:

    我相信解决您的问题的方法是 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

    *然后点击创建基本任务,并将您的任务设置为您喜欢的任何时间!

    【讨论】:

      【解决方案4】:

      你想要怎么样?

      我不太清楚,结果究竟应该如何——它应该是扁平化还是应该是分层的?

      看这个例子:

      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 之外没有任何其他文件),还是应该是像这样的 扁平化结果:

      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 在当前工作目录的*.jpg 列表中的每个%%f,执行函数copyFile/r 开关使列表递归(遍历所有子目录)。

      在函数中,传递给它的参数(现在称为%~1)被传递给复制函数:将文件复制到目标目录,在本例中为..\target/V 让复制验证结果,/-Y 让它请求覆盖文件的权限。见copy /?

      非常大的问题:如果您在源目录的不同子文件夹中有一个或多个文件,它们具有相同的名称(如我的示例中的两个cheese.jpgs),你会丢失数据!

      因此,我不推荐这种方法,因为您可能会丢失数据(数码相机在命名图片时不是很有创意!)。

      分层

      只需使用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

      【讨论】:

      • 我正在寻找一个扁平化的解决方案,并且该脚本适用于一个但...我不能在共享 Intranet 上运行批处理文件,所以我需要一个指向图像的文件夹的源链接将被拉出
      • 你不能用net use Y: \\intranet\PP Complete Images\ 吗?然后您可以通过驱动器号Y:访问共享。
      • 这是一家公司的碎盘 这是我用来访问目标中所有文件夹的链接:\\btbnas\PP Complete Images
      • 但我可以指定目标 ish 共享文件夹 + 我只需要 *.jpg 文件吗?
      • for 命令从当前工作目录中查找所有元素。因此,您可以使用 net use Y: \\intranet\PP Complete Images\ 将 Y: 映射到您的共享。之后,Y: 命令将工作目录更改为您的共享。
      猜你喜欢
      • 1970-01-01
      • 2016-04-23
      • 2012-02-12
      • 1970-01-01
      • 2011-10-05
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多