Board logo

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

作者: xzwcn    时间: 2019-10-13 20:41     标题: 【已解决】如何复制文件夹的所有文件(支持排除特定文件夹、扩展名)?

本帖最后由 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文件)?
作者: xzwcn    时间: 2019-10-13 21:20

回复 2# ivor

不了解powershell ,请问这个要怎么执行呢?
作者: ivor    时间: 2019-10-13 21:21

本帖最后由 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。不知道我理解的对不对
作者: xzwcn    时间: 2019-10-13 21:38

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

回复 3# ivor

理解正确,但是运行bat出错了。
作者: xzwcn    时间: 2019-10-13 21:51

本帖最后由 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
复制代码

作者: ivor    时间: 2019-10-13 22:21

排除的文件夹,就会提示因为“E:\wwwroot\App\1.config”处不存在项。属于正常情况
作者: xzwcn    时间: 2019-10-13 23:29

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

回复 6# ivor

1.config是存在的。另外,我是要复制到App2的,源文件夹不能发生任何变化。
作者: ivor    时间: 2019-10-13 23:50

Move-Item换成Copy-Item就可以了
作者: xzwcn    时间: 2019-10-14 00:04

回复 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空文件夹
作者: terse    时间: 2019-10-14 01:32

  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
复制代码

作者: xzwcn    时间: 2019-10-14 12:23

回复 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
复制代码

作者: xzwcn    时间: 2019-10-14 15:53

回复 10# terse

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

回复 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需要怎么修改?
作者: terse    时间: 2019-10-14 17:34

回复 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 排除的目录
作者: xzwcn    时间: 2019-10-14 18:35

本帖最后由 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 ,可以实现,我想优化一下。
作者: terse    时间: 2019-10-14 19:44

回复 15# xzwcn
为什么要两次?
作者: xzwcn    时间: 2019-10-14 20:58

回复 16# terse
一次我不知道怎么实现
作者: terse    时间: 2019-10-14 21:31

本帖最后由 terse 于 2019-10-14 21:32 编辑

回复 17# xzwcn
是我理解能力差吗 你最终想实现怎样的效果?
是复制.git后缀的文件 而不复制.git目录吗
你最后的又复制了.git 目录是不是
作者: xzwcn    时间: 2019-10-14 21:48

回复 18# terse

应该是我表达得不好,.git是目录,不是文件,我是希望复制整个.git目录。
作者: terse    时间: 2019-10-14 21:52

回复 19# xzwcn
你不排除的话 可以复制的吧
作者: xzwcn    时间: 2019-10-14 21:59

本帖最后由 xzwcn 于 2019-10-14 22:01 编辑

回复 20# terse
  1. @echo off
  2. set /p SourcePath=请输入或拖入源文件夹路径:
  3. set TargerPath=%SourcePath%1
  4. md "%TargerPath%">nul
  5. ROBOCOPY "%SourcePath%" "%TargerPath%" *.config *.gitattributes *.gitignore Log /XD .vs Bin obj /S
  6. ::ROBOCOPY "%SourcePath%"\.git "%TargerPath%"\.git /S /E
  7. pause
复制代码
源路径下是有.git的文件夹(属性是隐藏),执行后得到的文件夹里没有.git目录(因为里面没有*.config *.gitattributes *.gitignore的文件),我是希望不要过滤.git里的文件类型,整个复制出来。
作者: terse    时间: 2019-10-14 22:14

本帖最后由 terse 于 2019-10-14 22:17 编辑

回复 21# xzwcn
怎么回事 刚刚试了 我这边隐藏文件夹可以复制的啊
不过没有你要的文件类型的话 那就复制空文件夹 加 /E 看看
作者: xzwcn    时间: 2019-10-14 22:26

回复 22# terse

加E,复制出来的文件夹是空的。非.git目录的文件夹出生成了,也是空的。
作者: terse    时间: 2019-10-14 22:53

不过滤.git里的文件类型的话 那就二步吧
排除文件看来也不行 因为你的.git目录是要全部复制的




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