标题: [文本处理] [已解决]批处理复制文件问题 [打印本页]
作者: 豆豆吖 时间: 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- @echo off
- for /d /r %%a in (790 无logo images) do if exist "%%a" robocopy "%%a" "target\%%~nxa" *.jpg *.png>nul
- pause
复制代码
====================================================================
最终更新部分:- @echo off&cd/d "%~dp0"
-
- set "curDir=%cd%"
- for /d %%i in (*) do if "%%i" neq "target" (
- pushd "%%i"
- for /d /r %%a in (790 ÎŞlogo images) do if exist "%%a" (
- set "fpath=%%a"
- set "parent=%cd%\%%i"
- setlocal enabledelayedexpansion
- call,robocopy "!fpath!" "!curDir!\target%%fpath:!parent!=%%" *.jpg *.png>nul
- endlocal
- )
- popd
- )
- pause
复制代码
作者: wrove 时间: 2019-1-25 19:30
本帖最后由 wrove 于 2019-1-26 00:37 编辑
- function Copy-ItemWithKeepTheDirectoryStructure {
- <#
- .EXAMPLE
- Copy-ItemWithKeepTheDirectoryStructure -FromFolder D:\ `
- -ToFolder test -Extensions txt, xml `
- -SearchSubFolders bin, data
-
- .EXAMPLE
- Copy-ItemWithKeepTheDirectoryStructure -FromFolder e:\ `
- -ToFolder test -Extensions txt, doc
- #>
- param(
- [Parameter(Mandatory = $true,
- Position = 1)]
- [ValidateScript({ Test-Path $_ })]
- [string]$FromFolder,
-
- [Parameter(Mandatory = $true,
- Position = 2)]
- [string]$ToFolder,
-
- [Parameter(Mandatory = $true)]
- [string[]]$Extensions,
-
- [Parameter(Mandatory = $false)]
- [string[]]$SearchSubFolders
- )
- #0.检查并标准化参数
- if(!(Test-Path $ToFolder)) {
- New-Item -ItemType Directory -Path $ToFolder | Out-Null
- }
- $ToFolder = (Resolve-Path $ToFolder).Path
- $FromFolder = (Resolve-Path $FromFolder).Path
- if($FromFolder -eq $ToFolder) {
- throw [System.ArgumentException]::new(
- 'FromFolder与ToFolder必须指向不同的目录')
- }
- $Extensions = $Extensions |
- ForEach-Object {
- if($_.StartsWith('*.')) {
- $_
- } else {
- '*.' + $_
- }
- }
- #1.切换目录
- Push-Location
- Set-Location $FromFolder
- #2.开始处理
- if($SearchSubFolders -eq $null) {
- Get-ChildItem -Recurse -File -Include $Extensions |
- ForEach-Object {
- $sPath = Resolve-Path $_.FullName -Relative
- $lPath = Split-Path $sPath
- $rPath = Split-Path $sPath -Leaf
- $dPath = $ToFolder + $sPath.Substring(1)
- $dFolder = $ToFolder + $lPath.Substring(1)
- if(!(Test-Path $dFolder)) {
- New-Item -ItemType Directory -Path $dFolder | Out-Null
- }
- Copy-Item -LiteralPath $sPath -Destination $dPath | Out-Null
- }
- } else {
- Get-ChildItem -Recurse -Directory -Include $SearchSubFolders |
- ForEach-Object {
- Get-ChildItem -Path ($_.FullName + '\*') -File `
- -Include $Extensions
- } | ForEach-Object {
- $sPath = Resolve-Path $_.FullName -Relative
- $lPath = Split-Path $sPath
- $rPath = Split-Path $sPath -Leaf
- $dPath = $ToFolder + $sPath.Substring(1)
- $dFolder = $ToFolder + $lPath.Substring(1)
- if(!(Test-Path $dFolder)) {
- New-Item -ItemType Directory -Path $dFolder | Out-Null
- }
- Copy-Item -LiteralPath $sPath -Destination $dPath | Out-Null
- }
- }
- #3.切换回原有的当前目录
- Pop-Location
- }
复制代码
作者: 豆豆吖 时间: 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 |