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

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

情况描述如下:

有文件夹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, 有点转不过弯, 请求高手指教, 多谢

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

TOP

回复 2# idwma


    感谢, 刚试了一下, 名字是改了, 但是后缀也给改了, 原来的txt变成了jpg

TOP

  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

评分人数

    • 5i365: 感谢,牛x技术 + 1

TOP

回复 6# WHY


    排序还能这么用学到了

TOP

本帖最后由 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了

TOP

受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

评分人数

    • 5i365: 牛X 感谢技术 + 1

TOP

本帖最后由 5i365 于 2021-11-14 06:09 编辑

回复 9# idwma


    {0:00000000000}
你好, 这是什么意思? 没查到
代码太高深了, 完全看不懂了,
还有简单易懂的方法吗

TOP

本帖最后由 5i365 于 2021-11-14 13:19 编辑

回复 9# idwma


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

另外1文件夹, 如果文件夹名字改成  中国10 - 副本 - 副本
就不会处理

TOP

回复 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')")"}
复制代码

TOP

返回列表