Board logo

标题: [文本处理] [已解决]批处理复制文件问题 [打印本页]

作者: 豆豆吖    时间: 2019-1-25 18:11     标题: [已解决]批处理复制文件问题

遇到一个问题,百度了2天,尝试了能想到的方法都没解决,希望大神帮帮忙。
问题是这样:
在一个有任意层级的文件夹内,存放着我需要的图片文件。我想把 “790”、“无logo”、“images” 这个文件夹下的图片文件复制和.bat文件同级的target文件夹内。

最好的情况是连同他的目录结构一块复制出来。
其次是把上述3个目录下所有文件复制出来可。

如果上述两种方法都不可行,也可以通过删除,最后留下包含上述3个名字的路径文件及子文件也可。

这个问题,我能力有限,恳请大神费时间帮忙思考解决。再次感谢!
作者: yhcfsr    时间: 2019-1-25 19:01

问题1:图片文件都有哪些格式?
问题2:target是否与790等文件夹在一个总目录内,而且790等文件夹的目录级数要多于target?
问题3:是否要复制790等文件夹内的子文件夹?
作者: 豆豆吖    时间: 2019-1-25 19:03

target目录和准备执行的脚本放在最顶层,层级和图中第一层文件夹并列
这是我简化的模型

让各位大大费心了
作者: 豆豆吖    时间: 2019-1-25 19:04

本帖最后由 豆豆吖 于 2019-1-25 19:16 编辑

回复 2# yhcfsr

    你好,目录简化结构会是3楼的样子(实际上还有更多不需要的文件夹)。
    回答1:图片的文件类型是jpg
    回答2:可以把target和脚本文件至于此目录的最顶层。(最好的情况是在target文件夹内,复制790 images 无logo 3个所需文件的目录结构及此3个文件夹内的jpg文件)
    回答3:790等文件夹下不会再有文件夹了,里面只有所需要的图片文件。

    如果第2条最好情况很复杂的话,也可放弃目录结构,把图片文件全复制出来即可。但这样可能存在图片文件重名的问题。所以最好是连目录结构一并复制了
作者: yhcfsr    时间: 2019-1-25 19:18     标题: 最终更新

本帖最后由 yhcfsr 于 2019-1-25 20:23 编辑

回复 3# 豆豆吖


描述的很详细,看了很舒服.
我还忘记一个问题,因为你有多个同名目录,这些目录复制到target势必会合并,那么同名文件如何处理?是同名文件重命名,还是同名目录重命名?重命名的规则又是什么?又或者是直接覆盖同名文件?

以下脚本,对于同名文件采用更新的方式进行复制.
所谓更新方式:
        如果两个790中都存在a.jpg,如果两个图片完全相同,则后来的同名a.jpg不复制;
        如果两个图片只是名字相同,内容不同,则最终保留目录级数多的790内的a.jpg
  1. @echo off
  2. for /d /r %%a in (790 无logo images) do if exist "%%a" robocopy "%%a" "target\%%~nxa" *.jpg *.png>nul
  3. pause
复制代码
====================================================================
最终更新部分:
  1. @echo off&cd/d "%~dp0"
  2. set "curDir=%cd%"
  3. for /d %%i in (*) do if "%%i" neq "target" (
  4. pushd "%%i"
  5. for /d /r %%a in (790 ÎŞlogo images) do if exist "%%a" (
  6. set "fpath=%%a"
  7. set "parent=%cd%\%%i"
  8. setlocal enabledelayedexpansion
  9. call,robocopy "!fpath!" "!curDir!\target%%fpath:!parent!=%%" *.jpg *.png>nul
  10. endlocal
  11. )
  12. popd
  13. )
  14. pause
复制代码

作者: wrove    时间: 2019-1-25 19:30

本帖最后由 wrove 于 2019-1-26 00:37 编辑
  1. function Copy-ItemWithKeepTheDirectoryStructure {
  2.     <#
  3.     .EXAMPLE
  4.     Copy-ItemWithKeepTheDirectoryStructure -FromFolder D:\ `
  5.         -ToFolder test -Extensions txt, xml `
  6.         -SearchSubFolders bin, data
  7.     .EXAMPLE
  8.     Copy-ItemWithKeepTheDirectoryStructure -FromFolder e:\ `
  9.         -ToFolder test -Extensions txt, doc
  10.     #>
  11.     param(
  12.         [Parameter(Mandatory = $true,
  13.                    Position = 1)]
  14.         [ValidateScript({ Test-Path $_ })]
  15.         [string]$FromFolder,
  16.         [Parameter(Mandatory = $true,
  17.                    Position = 2)]
  18.         [string]$ToFolder,
  19.         [Parameter(Mandatory = $true)]
  20.         [string[]]$Extensions,
  21.         [Parameter(Mandatory = $false)]
  22.         [string[]]$SearchSubFolders
  23.     )
  24.     #0.检查并标准化参数
  25.     if(!(Test-Path $ToFolder)) {
  26.         New-Item -ItemType Directory -Path $ToFolder | Out-Null
  27.     }
  28.     $ToFolder = (Resolve-Path $ToFolder).Path
  29.     $FromFolder = (Resolve-Path $FromFolder).Path
  30.     if($FromFolder -eq $ToFolder) {
  31.         throw [System.ArgumentException]::new(
  32.             'FromFolder与ToFolder必须指向不同的目录')
  33.     }
  34.     $Extensions = $Extensions |
  35.         ForEach-Object {
  36.             if($_.StartsWith('*.')) {
  37.                 $_
  38.             } else {
  39.                 '*.' + $_
  40.             }
  41.         }
  42.     #1.切换目录
  43.     Push-Location
  44.     Set-Location $FromFolder
  45.     #2.开始处理
  46.     if($SearchSubFolders -eq $null) {
  47.         Get-ChildItem -Recurse -File -Include $Extensions |
  48.             ForEach-Object {
  49.                 $sPath = Resolve-Path $_.FullName -Relative
  50.                 $lPath = Split-Path $sPath
  51.                 $rPath = Split-Path $sPath -Leaf
  52.                 $dPath = $ToFolder + $sPath.Substring(1)
  53.                 $dFolder = $ToFolder + $lPath.Substring(1)
  54.                 if(!(Test-Path $dFolder)) {
  55.                     New-Item -ItemType Directory -Path $dFolder | Out-Null
  56.                 }
  57.                 Copy-Item -LiteralPath $sPath -Destination $dPath | Out-Null
  58.             }
  59.     } else {
  60.         Get-ChildItem -Recurse -Directory -Include $SearchSubFolders |
  61.             ForEach-Object {
  62.                 Get-ChildItem -Path ($_.FullName + '\*') -File `
  63.                     -Include $Extensions
  64.             } | ForEach-Object {
  65.                 $sPath = Resolve-Path $_.FullName -Relative
  66.                 $lPath = Split-Path $sPath
  67.                 $rPath = Split-Path $sPath -Leaf
  68.                 $dPath = $ToFolder + $sPath.Substring(1)
  69.                 $dFolder = $ToFolder + $lPath.Substring(1)
  70.                 if(!(Test-Path $dFolder)) {
  71.                     New-Item -ItemType Directory -Path $dFolder | Out-Null
  72.                 }
  73.                 Copy-Item -LiteralPath $sPath -Destination $dPath | Out-Null
  74.             }
  75.     }
  76.     #3.切换回原有的当前目录
  77.     Pop-Location
  78. }
复制代码

作者: 豆豆吖    时间: 2019-1-25 19:35

回复 5# yhcfsr


    待操作的文件夹内确实存在多个我需要的“790”、“images”、“无logo”目录。所以我希望能连同目录结构一并复制出来。
    如果上述方法不可行。我想能否通过删除的方式,清理待操作目录,从而最终保留“790”、“images”、“无logo”等文件夹及其包含的图片文件。
   
    我有一个思路不知道是否可行:判断每一个文件的路径,如果路径中是否含有 “790” 或 “images” 或 “无logo”,如果为否就把该文件删除。最终待操作的文件夹只剩下需要的图片文件与空文件夹。
作者: yhcfsr    时间: 2019-1-25 19:41

回复 7# 豆豆吖


    5楼代码试试.
你所说的目录结构是从盘符算起,还是从target同级目录算起?
这里沟通费时费力,最好加下论坛群.




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2