[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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, 有点转不过弯, 请求高手指教, 多谢

回复 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

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

回复 9# idwma


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

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

TOP

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

回复 9# idwma


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

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-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

回复 6# WHY


    排序还能这么用学到了

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

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

TOP

返回列表