标题: [文件操作] 【已解决】如何复制文件夹的所有文件(支持排除特定文件夹、扩展名)? [打印本页]
作者: 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 编辑
- @echo off
- powershell "Copy-Item -path '%1\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'"
- 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执行,拖入文件夹,提示:- E:\wwwroot\App
- 'powershell' 不是内部或外部命令,也不是可运行的程序
- 或批处理文件。
- 请按任意键继续. . .
复制代码
先打开cmd窗口,输入:- powershell "Move-Item -path 'E:\wwwroot\App\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'"
复制代码
提示:- Move-Item : 无法移动项,因为“E:\wwwroot\App\1.config”处不存在项。
- 所在位置 行:1 字符: 10
- + Move-Item <<<< -path 'E:\wwwroot\App\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'
- + CategoryInfo : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
- + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
-
- Move-Item : 无法移动项,因为“E:\wwwroot\App\2.scc”处不存在项。
- 所在位置 行:1 字符: 10
- + Move-Item <<<< -path 'E:\wwwroot\App\*' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'E:\App2'
- + CategoryInfo : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
- + 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
执行:- @echo on
- powershell "Copy-Item -path 'App' -Exclude 'Log','Bin','.git,','.vs','*.scc','*.log','*.config' -Destination 'App2'"
- pause
复制代码
得到的是:
App2空文件夹
作者: terse 时间: 2019-10-14 01:32
- @echo off
- (for %%i in (.scc .log .config \log\ \Bin\ \.git\ \.vs\) do echo %%i)>EXCLUDE
- md "D:\app2\" 2>nul
- xcopy "D:\app" "D:\app2\" /E /H /R /Y /EXCLUDE:EXCLUDE
- pause
复制代码
作者: xzwcn 时间: 2019-10-14 12:23
回复 10# terse
谢谢!
我改成了变量,可拖入:- @echo off
- set /p SourcePath=请输入或拖入源文件夹路径:
- set TargerPath=%SourcePath%2
- set TempFile=tempFile
- (for %%i in (.scc .log .config .vssscc .gitattributes .gitignore .publishproj .vspscc \log\ \Bin\ \.git\ \.vs\) do echo %%i)>%TempFile%
- md %TargerPath%>nul
- xcopy %SourcePath% %TargerPath% /E /H /R /Y /EXCLUDE:%TempFile%
- del %TempFile%
- pause
复制代码
作者: xzwcn 时间: 2019-10-14 15:53
回复 10# terse
你好,还有个问题请教下,如何处理文件名与目录名后缀相同的问题?
例如我是希望排除.config的文件,但不要排除以.config为后缀的文件夹,要怎么修改代码?
作者: xzwcn 时间: 2019-10-14 16:27
回复 10# terse - @echo off
- set /p SourcePath=请输入或拖入要清理的文件夹路径:
- set TargerPath=%SourcePath%1
- set TempFile=tempFile1
- (for %%i in (.config .gitattributes .gitignore \.git\ \.vs\ \log\) do echo %%i)>%TempFile%
- md %TargerPath%>nul
- xcopy %SourcePath% %TargerPath% /E /H /R /Y /EXCLUDE:%TempFile% rem:【注意】EXCLUDE需要修改
- del %TempFile%
- pause
复制代码
另外,和前面的反过来,只复制指定的文件夹、文件(文件层次结构不变),EXCLUDE需要怎么修改?
作者: terse 时间: 2019-10-14 17:34
回复 12# xzwcn
用ROBOCOPY试试吧- @echo off
- set /p SourcePath=请输入或拖入源文件夹路径:
- set TargerPath=%SourcePath%2
- md "%TargerPath%">nul
- ROBOCOPY "%SourcePath%" "%TargerPath%" /XF *.scc *.log *.config *.gitattributes *.gitignore *.publishproj /XD log Bin .git /s /e
- pause
复制代码
/XF 排除的文件类型 /XD 排除的目录
作者: xzwcn 时间: 2019-10-14 18:35
本帖最后由 xzwcn 于 2019-10-14 18:44 编辑
回复 14# terse - @echo off
- set /p SourcePath=请输入或拖入源文件夹路径:
- set TargerPath=%SourcePath%1
- md "%TargerPath%">nul
- ROBOCOPY "%SourcePath%" "%TargerPath%" *.git *.config *.gitattributes *.gitignore Log /XD .vs Bin obj /S
- ROBOCOPY "%SourcePath%"\.git "%TargerPath%"\.git /S /E
- pause
- 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 - @echo off
- set /p SourcePath=请输入或拖入源文件夹路径:
- set TargerPath=%SourcePath%1
- md "%TargerPath%">nul
- ROBOCOPY "%SourcePath%" "%TargerPath%" *.config *.gitattributes *.gitignore Log /XD .vs Bin obj /S
- ::ROBOCOPY "%SourcePath%"\.git "%TargerPath%"\.git /S /E
- 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 |