Board logo

标题: [问题求助] Powershell用一文件夹中的文件名给另一文件夹中的文件重命名 [打印本页]

作者: 5i365    时间: 2021-11-10 06:09     标题: 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, 有点转不过弯, 请求高手指教, 多谢
作者: idwma    时间: 2021-11-10 23:02

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

作者: 5i365    时间: 2021-11-11 09:34

回复 2# idwma


    感谢, 刚试了一下, 名字是改了, 但是后缀也给改了, 原来的txt变成了jpg
作者: idwma    时间: 2021-11-11 13:43

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

作者: idwma    时间: 2021-11-12 09:18

回复 6# WHY


    排序还能这么用学到了
作者: 5i365    时间: 2021-11-13 18:43

本帖最后由 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了
作者: idwma    时间: 2021-11-13 20:30

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

作者: 5i365    时间: 2021-11-14 06:07

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

回复 9# idwma


    {0:00000000000}
你好, 这是什么意思? 没查到
代码太高深了, 完全看不懂了,
还有简单易懂的方法吗
作者: 5i365    时间: 2021-11-14 13:10

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

回复 9# idwma


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

另外1文件夹, 如果文件夹名字改成  中国10 - 副本 - 副本
就不会处理
作者: idwma    时间: 2021-11-14 15:28

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





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