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

[文件操作] 请教,批处理根据文件夹名称分类复制到对应文件夹

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

谢谢。

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

TOP

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

TOP

回复 3# xczxczxcz


win7 的ps2.0,没有$pwd ,没有gci -Directory参数

TOP

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

TOP

回复 5# xczxczxcz


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

TOP

回复  flashercs

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



    感谢各位帮助,我的环境是win7 ps通过官网补丁手动升到了4.0,运行代码有error

TOP

偶测试了下,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.到最新版。

TOP

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

5楼的方法也改成一样的写法,

TOP

回复 7# cxy03791695766


    2楼代码可以吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 8# xczxczxcz


    不好意思 还有些不太明白,我在PS运行后提示“请为以下参数提供值”,我该填写什么内容?请指教,谢谢。

TOP

回复 10# Batcher


    感谢管理员关注,二楼大牛的代码是针对我的举例写的,和实际情况不是很适用,不过也谢谢帮忙。

TOP

回复 12# cxy03791695766


    把实际情况跟2楼说说,请他帮忙更新一下代码吧。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# flashercs


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

希望可以通过批处理扫描获取A的文件夹名称,找到名称包含1001的文件夹,把该文件夹下的所有文件拷贝到B的1001中,2002_xxx到B\2002,如此循环。

TOP

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发现木有问题。

TOP

返回列表