Board logo

标题: [文件操作] 请教,批处理根据文件夹名称分类复制到对应文件夹 [打印本页]

作者: cxy03791695766    时间: 2018-12-12 14:55     标题: 请教,批处理根据文件夹名称分类复制到对应文件夹

A有数个文件夹,例如:1001_xxx ,  2002_xxx , xxx_3003,
B有对应1001 , 2002 , 3003文件夹,

获取A内的文件夹名称,把每个文件夹内的所有文件拷贝到B对应的文件夹

例如:
把A/1001_xxx的所有文件拷贝到B/1001
A/2002_xxx的所有文件拷贝到B/2002
A/xxx_3003的所有文件拷贝到B/3003

谢谢。
作者: flashercs    时间: 2018-12-12 17:44

  1. @echo off
  2. for /d %%a in ("A\1001_???") do copy /y "%%a\*.*" "B\1001\"
  3. for /d %%a in ("A\2002_???") do copy /y "%%a\*.*" "B\2002\"
  4. for /d %%a in ("A\???_3003") do copy /y "%%a\*.*" "B\3003\"
  5. pause
复制代码

作者: xczxczxcz    时间: 2018-12-12 20:53

WIN7 以上系统,开启PS
  1. gci "$Pwd\A" -Directory -Recurse -Depth 0|%{
  2. foreach ($Number in @($_.name.Split('_'))) {
  3. $err=$null
  4. foreach ($i in ($Number.GetEnumerator())){
  5. if (![Char]::IsDigit("$i")){$err='yes'}
  6. }
  7. if (!$err){$Folder=$Number}
  8. }
  9. if([Io.Directory]::Exists("$Pwd\B\$Folder")){
  10. Get-Item "$($_.fullname)\*"|%{
  11. Copy $_.Fullname -Dest "$Pwd\B\$Folder\" -Recurse -Force
  12. if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
  13. }
  14. }
  15. }
  16. pause
复制代码

作者: flashercs    时间: 2018-12-13 14:47

回复 3# xczxczxcz


win7 的ps2.0,没有$pwd ,没有gci -Directory参数
作者: xczxczxcz    时间: 2018-12-13 21:14

回复 4# flashercs

主系统是 WIN10 PS5.1;虚拟机也是WIN7 PS5.1;已经不知道 win7 PS2.0有哪些命令和参数了。微软也不给WIN7 WIN8的PS自动升级。
试下这个能不能在 win7 ps2.0中运行.
  1. gci ".\A" -Attributes Directory -Recurse -Depth 0|%{
  2. foreach ($Number in @($_.name.Split('_'))) {
  3. if(($Number).GetType().Name -match 'Int32'){$Folder=$Number}
  4. }
  5. if([Io.Directory]::Exists(".\B\$Folder")){
  6. Get-Item "$($_.fullname)\*"|%{
  7. Copy $_.Fullname -Dest ".\B\$Folder\" -Recurse -Force
  8. if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
  9. }
  10. }
  11. }
复制代码

作者: flashercs    时间: 2018-12-13 22:04

回复 5# xczxczxcz


    你可以打开2.0模式 试一下吗.
  1. powershell -version 2.0
复制代码

作者: cxy03791695766    时间: 2018-12-14 16:14

回复  flashercs

主系统是 WIN10 PS5.1;虚拟机也是WIN7 PS5.1;已经不知道 win7 PS2.0有哪些命令和参数 ...
xczxczxcz 发表于 2018-12-13 21:14



    感谢各位帮助,我的环境是win7 ps通过官网补丁手动升到了4.0,运行代码有error
作者: xczxczxcz    时间: 2018-12-14 17:08

偶测试了下,3.0以上都支持。方法:鼠标右键打开 test1.ps1,选择使用powershll运行。test1.ps1与A/B文件夹放在同一目录。
如果你的电脑不能运行PS1脚本则把下面的保存为 “开启PS脚本.reg” 并导入注册表,再按上面的方法。
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
  3. "ExecutionPolicy"="Bypass"
复制代码
=========既然升到了 4.0,为何不再升到5.0以上。
升PS的同时记得同时升级 NET.FRAMEWORK.到最新版。
作者: xczxczxcz    时间: 2018-12-14 17:29

如果你不想升级的话这样也行。
把第一句
  1. gci "gci "$Pwd\A" -Directory -Recurse -Depth 0|%{
复制代码
改成
  1. gci "$Pwd\A" -Directory|%{
复制代码
目的都是为了只读第一层文件夹。

5楼的方法也改成一样的写法,
作者: Batcher    时间: 2018-12-14 19:46

回复 7# cxy03791695766


    2楼代码可以吗?
作者: cxy03791695766    时间: 2018-12-17 10:43

回复 8# xczxczxcz


    不好意思 还有些不太明白,我在PS运行后提示“请为以下参数提供值”,我该填写什么内容?请指教,谢谢。
作者: cxy03791695766    时间: 2018-12-17 10:46

回复 10# Batcher


    感谢管理员关注,二楼大牛的代码是针对我的举例写的,和实际情况不是很适用,不过也谢谢帮忙。
作者: Batcher    时间: 2018-12-17 11:58

回复 12# cxy03791695766


    把实际情况跟2楼说说,请他帮忙更新一下代码吧。
作者: cxy03791695766    时间: 2018-12-17 13:21

回复 2# flashercs


    感谢帮忙,上面的举例并不就是实际情况,除了上面列的之外还会有很多类似名称的文件夹

希望可以通过批处理扫描获取A的文件夹名称,找到名称包含1001的文件夹,把该文件夹下的所有文件拷贝到B的1001中,2002_xxx到B\2002,如此循环。
作者: xczxczxcz    时间: 2018-12-17 14:24

gci ".\A" -Directory|%{
        foreach ($Number in @($_.name.Split('_'))) {
                $err=$null
                foreach ($i in ($Number.GetEnumerator())){
                        if (![Char]::IsDigit("$i")){$err='yes'}
                }
                if (!$err){$Folder=$Number}
        }
        if([Io.Directory]::Exists(".\B\$Folder")){
                Get-Item "$($_.fullname)\*"|%{
                        Copy $_.Fullname -Dest ".\B\$Folder\" -Recurse -Force
                        if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
                }
        }
}
直接点右键选"Powershell"运行即可。在虚拟机中装了个win8.1  ps4发现木有问题。
作者: xczxczxcz    时间: 2018-12-17 14:56

支持文件夹名 xxxxx-xxxxx_xxx_xxxx-数字-xxxx_xxxx等,如有多段数字则以最后一段数字为文件夹。分隔线为 “-" 或"_"  把脚本和A/B文件夹放同一目录
  1. gci "$Pwd\A" -Directory|%{
  2. foreach ($Number in @($_.name.Split('_-'))) {
  3. $err=$null
  4. foreach ($i in ($Number.GetEnumerator())){
  5. if (![Char]::IsDigit("$i")){$err='yes'}
  6. }
  7. if (!$err){$Folder=$Number}
  8. }
  9. if([Io.Directory]::Exists("$Pwd\B\$Folder")){
  10. Get-Item "$($_.fullname)\*"|%{
  11. Copy $_.Fullname -Dest "$Pwd\B\$Folder\" -Recurse -Force
  12. if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
  13. }
  14. }
  15. }
复制代码
若在命令行中运行脚本,不需要运行管理员模式,用普通用户模式即可。若运行提示没有权限,则导入下面的注册表即可。可以在脚本上点右键,然后选择在powershell 中运行。

注册表 提权  xxx.reg
  1. Windows Registry Editor Version 5.00
  2. [HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
  3. "ExecutionPolicy"="Bypass"
复制代码

作者: cxy03791695766    时间: 2018-12-17 15:51

回复 15# xczxczxcz


    厉害,膜拜大神!

厚着脸再问一下,可否有办法让我手动填写AB的路径,然后再执行复制命令。
作者: xczxczxcz    时间: 2018-12-17 17:04

本帖最后由 xczxczxcz 于 2018-12-17 17:06 编辑

回复 17# cxy03791695766

先运行脚本 按提示操作, 文件名长度不能超过80个字符。脚本可放任意位置。若手工输入需要完整路径。
  1. $A文件夹=Read-host -Prompt "拖入 A 文件夹 并回车"
  2. $B文件夹=Read-host -Prompt "拖入 B 文件夹 并回车"
  3. gci "$A文件夹" -Directory|%{
  4. foreach ($Number in @($_.name.Split('_-'))) {
  5. $err=$null
  6. foreach ($i in ($Number.GetEnumerator())){
  7. if (![Char]::IsDigit("$i")){$err='yes'}
  8. }
  9. if (!$err){$Folder=$Number}
  10. }
  11. if([Io.Directory]::Exists("$B文件夹\$Folder")){
  12. Get-Item "$($_.fullname)\*"|%{
  13. Copy $_.Fullname -Dest "$B文件夹\$Folder\" -Recurse -Force
  14. if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
  15. }
  16. }
  17. }
  18. pause
复制代码
==============enjoy================
作者: cxy03791695766    时间: 2018-12-17 17:39

回复 18# xczxczxcz


    完美!太感谢了!




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