[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【已解决】如何复制文件夹的所有文件(支持排除特定文件夹、扩展名)?

本帖最后由 xzwcn 于 2019-10-15 19:01 编辑

例如:当前在E盘根目录,有文件夹App(里面包含Log、Bin、.git,.vs等文件夹,*.scc,*.log,*.config,*.html,*.js等文件)。
如何实现打开批处理,输入(或拖入)文件夹路径(例如这里是:E:\App\),回车后,
在E盘根目录(即当前文件夹)得到:App2(不要Log、Bin、.git,.vs文件夹、*.scc、*.log,*.config文件)?

回复 2# ivor

不了解powershell ,请问这个要怎么执行呢?

TOP

本帖最后由 ivor 于 2019-10-13 23:47 编辑
  1. @echo off
  2. powershell "Copy-Item -path '%1\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'"
  3. pause
复制代码
文件夹拖入方式,代码保存为.bat运行。
拖入E:\App1,排除'Log','Bin','.git,','.vs','*.scc','*.log','*.config',复制到E:\App2。不知道我理解的对不对

TOP

本帖最后由 xzwcn 于 2019-10-13 21:52 编辑

回复 3# ivor

理解正确,但是运行bat出错了。

TOP

本帖最后由 xzwcn 于 2019-10-13 21:53 编辑

回复 3# ivor

保存为bat执行,拖入文件夹,提示:
  1. E:\wwwroot\App
  2. 'powershell' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. 请按任意键继续. . .
复制代码
先打开cmd窗口,输入:
  1. powershell "Move-Item  -path 'E:\wwwroot\App\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'"
复制代码
提示:
  1. Move-Item : 无法移动项,因为“E:\wwwroot\App\1.config”处不存在项。
  2. 所在位置 行:1 字符: 10
  3. + Move-Item <<<<   -path 'E:\wwwroot\App\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'
  4.     + CategoryInfo          : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
  5.     + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
  6. Move-Item : 无法移动项,因为“E:\wwwroot\App\2.scc”处不存在项。
  7. 所在位置 行:1 字符: 10
  8. + Move-Item <<<<   -path 'E:\wwwroot\App\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'
  9.     + CategoryInfo          : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
  10.     + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
复制代码

TOP

排除的文件夹,就会提示因为“E:\wwwroot\App\1.config”处不存在项。属于正常情况

TOP

本帖最后由 xzwcn 于 2019-10-13 23:31 编辑

回复 6# ivor

1.config是存在的。另外,我是要复制到App2的,源文件夹不能发生任何变化。

TOP

Move-Item换成Copy-Item就可以了

TOP

回复 8# ivor

App文件夹:
│  a.dll
│  b.bak
│  c.cmd

├─App_Code
│      aa.dll

|──Bin
        a.dll

执行:
  1. @echo on
  2. powershell "Copy-Item  -path 'App' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'App2'"
  3. pause
复制代码
得到的是:
App2空文件夹

TOP

  1. @echo off
  2. (for %%i in (.scc .log .config \log\ \Bin\ \.git\ \.vs\) do echo %%i)>EXCLUDE
  3. md "D:\app2\" 2>nul
  4. xcopy "D:\app" "D:\app2\" /E /H /R /Y /EXCLUDE:EXCLUDE
  5. pause
复制代码
1

评分人数

    • xzwcn: 乐于助人技术 + 1

TOP

回复 10# terse


谢谢!
我改成了变量,可拖入:
  1. @echo off
  2. set /p SourcePath=请输入或拖入源文件夹路径:
  3. set TargerPath=%SourcePath%2
  4. set TempFile=tempFile
  5. (for %%i in (.scc .log .config .vssscc .gitattributes .gitignore .publishproj .vspscc \log\ \Bin\ \.git\ \.vs\) do echo %%i)>%TempFile%
  6. md %TargerPath%>nul
  7. xcopy %SourcePath% %TargerPath% /E /H /R /Y /EXCLUDE:%TempFile%
  8. del %TempFile%
  9. pause
复制代码

TOP

回复 10# terse

你好,还有个问题请教下,如何处理文件名与目录名后缀相同的问题?
例如我是希望排除.config的文件,但不要排除以.config为后缀的文件夹,要怎么修改代码?

TOP

回复 10# terse
  1. @echo off
  2. set /p SourcePath=请输入或拖入要清理的文件夹路径:
  3. set TargerPath=%SourcePath%1
  4. set TempFile=tempFile1
  5. (for %%i in (.config .gitattributes .gitignore \.git\ \.vs\ \log\) do echo %%i)>%TempFile%
  6. md %TargerPath%>nul
  7. xcopy %SourcePath% %TargerPath% /E /H /R /Y /EXCLUDE:%TempFile% rem:【注意】EXCLUDE需要修改
  8. del %TempFile%
  9. pause
复制代码
另外,和前面的反过来,只复制指定的文件夹、文件(文件层次结构不变),EXCLUDE需要怎么修改?

TOP

回复 12# xzwcn
用ROBOCOPY试试吧
  1. @echo off
  2. set /p SourcePath=请输入或拖入源文件夹路径:
  3. set TargerPath=%SourcePath%2
  4. md "%TargerPath%">nul
  5. ROBOCOPY "%SourcePath%" "%TargerPath%" /XF *.scc *.log *.config *.gitattributes *.gitignore *.publishproj /XD log Bin .git /s /e
  6. pause
复制代码
/XF 排除的文件类型  /XD 排除的目录

TOP

本帖最后由 xzwcn 于 2019-10-14 18:44 编辑

回复 14# terse
  1. @echo off
  2. set /p SourcePath=请输入或拖入源文件夹路径:
  3. set TargerPath=%SourcePath%1
  4. md "%TargerPath%">nul
  5. ROBOCOPY "%SourcePath%" "%TargerPath%" *.git *.config *.gitattributes *.gitignore Log /XD .vs Bin obj /S
  6. ROBOCOPY "%SourcePath%"\.git "%TargerPath%"\.git /S /E
  7. pause
  8. pause
复制代码
谢谢提醒,这样可以复制到指定的文件,如果是.git目录,则不过滤文件类型,全部复制,可以只用一次ROBOCOPY 么?
上面用两次ROBOCOPY ,可以实现,我想优化一下。

TOP

返回列表