找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 15757|回复: 9

[问题求助] Powershell用一文件夹中的文件名给另一文件夹中的文件重命名

[复制链接]
发表于 2021-11-10 06:09:57 | 显示全部楼层 |阅读模式
情况描述如下:

有文件夹1和文件夹2
-------------
文件夹1中的文件名:
中国1.txt
中国2.txt
中国6.txt
中国12.txt
中国45.txt
-------------
文件夹2中的文件名:
日本3.jpg
日本5.jpg
日本6.jpg
两个文件夹中的文件排序规则都是, 按文件名,递增

现在想用文件夹2中的文件名, 分别对应的替换文件夹1中的文件名
最后期待的结果就是文件夹1中的
中国1.txt
中国2.txt
中国6.txt
-----------
变成了
日本3.txt
日本5.txt
日本6.txt
其它的文件名不变

刚入门Powershell, 有点转不过弯, 请求高手指教, 多谢
发表于 2021-11-10 23:02:05 | 显示全部楼层
  1. foreach($i in dir 文件夹2){[array]$a+=$i.name}
  2. foreach($i in dir 文件夹1){[array]$b+=$i.fullname}
  3. for($i=0;$i -le $a.count-1;$i++){ren $b[$i] $a[$i]}
复制代码
 楼主| 发表于 2021-11-11 09:34:22 | 显示全部楼层
回复 2# idwma


    感谢, 刚试了一下, 名字是改了, 但是后缀也给改了, 原来的txt变成了jpg
发表于 2021-11-11 13:43:49 | 显示全部楼层

  1. foreach($i in dir 文件夹2){[array]$a+=$i.name}
  2. foreach($i in dir 文件夹1){[array]$b+=$i.fullname}
  3. for($i=0;$i -le $a.count-1;$i++){ren $b[$i] "$("$($a[$i] -replace '\..*$','')"+"$($b[$i] -replace '^.*(\..*)$','$1')")"}
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 感谢,牛x

查看全部评分

发表于 2021-11-12 09:18:03 | 显示全部楼层
回复 6# WHY


    排序还能这么用学到了
 楼主| 发表于 2021-11-13 18:43:24 | 显示全部楼层
本帖最后由 5i365 于 2021-11-13 19:07 编辑

感谢楼主两位大侠帮助, 好像都存在一个问题

比如 1下文件
中01.txt
国02.txt
人03.txt
...
大10.txt
...
中99.txt
华100.txt
美101.txt

比如 2下文件
大001.jpg
中002.jpg
华003.jpg
...
小010.jpg
...
日099.jpg
本100.jpg
在101.txt

上面...代表连续的文件, 重命名到10时就会出问题, 因为在资源管理器下,10.txt后是11.txt ,但是一排序10.txt后就变成100.txt了
发表于 2021-11-13 20:30:00 | 显示全部楼层
受why启发的方法
  1. foreach($i in dir 文件夹2|sort{"{0:00000000000}" -f [int]($_.name -replace '\D(\d+).*','$1')}){[array]$a+=$i.name}
  2. foreach($i in dir 文件夹1|sort{"{0:00000000000}" -f [int]($_.name -replace '\D(\d+).*','$1')}){[array]$b+=$i.fullname}
  3. for($i=0;$i -le $a.count-1;$i++){ren $b[$i] "$("$($a[$i] -replace '\..*$','')"+"$($b[$i] -replace '^.*(\..*)$','$1')")"}
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 牛X 感谢

查看全部评分

 楼主| 发表于 2021-11-14 06:07:09 | 显示全部楼层
本帖最后由 5i365 于 2021-11-14 06:09 编辑

回复 9# idwma


    {0:00000000000}
你好, 这是什么意思? 没查到
代码太高深了, 完全看不懂了,
还有简单易懂的方法吗
 楼主| 发表于 2021-11-14 13:10:57 | 显示全部楼层
本帖最后由 5i365 于 2021-11-14 13:19 编辑

回复 9# idwma


    如果2文件夹中有个子文件夹abc, 没有文件, 这种情况下, 应该不做重命名操作, 因为没有参照文件名
但是执行上面的代码后, 仍会执行命名, 会把文件夹的名字当成文件名给了某个txt文件

另外1文件夹, 如果文件夹名字改成  中国10 - 副本 - 副本
就不会处理
发表于 2021-11-14 15:28:07 | 显示全部楼层
回复 9# 5i365

用0填充数字变成像000010 000011 000100之后再排序
  1. foreach($i in dir 文件夹2|?{$_.attributes -notlike "*directory*"}|sort{"{0:00000000000}" -f [int]($_.name -replace '.*?(\d+).*','$1')}){[array]$a+=$i.name}
  2. foreach($i in dir 文件夹1|?{$_.attributes -notlike "*directory*"}|sort{"{0:00000000000}" -f [int]($_.name -replace '.*?(\d+).*','$1')}){[array]$b+=$i.fullname}
  3. for($i=0;$i -le $a.count-1;$i++){ren $b[$i] "$("$($a[$i] -replace '\..*$','')"+"$($b[$i] -replace '^.*(\..*)$','$1')")"}
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:09 , Processed in 0.020415 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表