标题: [文件操作] 请教,批处理根据文件夹名称分类复制到对应文件夹 [打印本页]
作者: 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
- @echo off
- for /d %%a in ("A\1001_???") do copy /y "%%a\*.*" "B\1001\"
- for /d %%a in ("A\2002_???") do copy /y "%%a\*.*" "B\2002\"
- for /d %%a in ("A\???_3003") do copy /y "%%a\*.*" "B\3003\"
- pause
复制代码
作者: xczxczxcz 时间: 2018-12-12 20:53
WIN7 以上系统,开启PS- gci "$Pwd\A" -Directory -Recurse -Depth 0|%{
- 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("$Pwd\B\$Folder")){
- Get-Item "$($_.fullname)\*"|%{
- Copy $_.Fullname -Dest "$Pwd\B\$Folder\" -Recurse -Force
- if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
- }
- }
- }
- 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中运行.- gci ".\A" -Attributes Directory -Recurse -Depth 0|%{
- foreach ($Number in @($_.name.Split('_'))) {
- if(($Number).GetType().Name -match 'Int32'){$Folder=$Number}
- }
- if([Io.Directory]::Exists(".\B\$Folder")){
- Get-Item "$($_.fullname)\*"|%{
- Copy $_.Fullname -Dest ".\B\$Folder\" -Recurse -Force
- if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
- }
- }
- }
复制代码
作者: flashercs 时间: 2018-12-13 22:04
回复 5# xczxczxcz
你可以打开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” 并导入注册表,再按上面的方法。- Windows Registry Editor Version 5.00
- [HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
- "ExecutionPolicy"="Bypass"
复制代码
=========既然升到了 4.0,为何不再升到5.0以上。
升PS的同时记得同时升级 NET.FRAMEWORK.到最新版。
作者: xczxczxcz 时间: 2018-12-14 17:29
如果你不想升级的话这样也行。
把第一句- gci "gci "$Pwd\A" -Directory -Recurse -Depth 0|%{
复制代码
改成- 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文件夹放同一目录- gci "$Pwd\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("$Pwd\B\$Folder")){
- Get-Item "$($_.fullname)\*"|%{
- Copy $_.Fullname -Dest "$Pwd\B\$Folder\" -Recurse -Force
- if ($?){Write-host '复制文件:'$_.Fullname -fore Magenta}
- }
- }
- }
复制代码
若在命令行中运行脚本,不需要运行管理员模式,用普通用户模式即可。若运行提示没有权限,则导入下面的注册表即可。可以在脚本上点右键,然后选择在powershell 中运行。
注册表 提权 xxx.reg- Windows Registry Editor Version 5.00
- [HKEY_CURRENT_USER\Software\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell]
- "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个字符。脚本可放任意位置。若手工输入需要完整路径。- $A文件夹=Read-host -Prompt "拖入 A 文件夹 并回车"
- $B文件夹=Read-host -Prompt "拖入 B 文件夹 并回车"
- 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}
- }
- }
- }
- pause
复制代码
==============enjoy================
作者: cxy03791695766 时间: 2018-12-17 17:39
回复 18# xczxczxcz
完美!太感谢了!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |