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

[问题求助] PowerShell如何用csv文件中的几个字段拼成的字符去重命名文件夹

[复制链接]
发表于 2021-12-20 15:06:08 | 显示全部楼层 |阅读模式
一图顶千文:如下图所示:

在 Music 主文件夹中
有一个csv文件: MP3.csv
有几个子文件夹, 子文件夹的名字是csv文件中的第四列的某个值
现在想给这几个子文件夹改名, 在当前名字的前面, 加上csv文件中第一列的序号, 和第三列的歌手,

例如:
文件夹   自娱自乐
改名后变成    38_金志文 - 自娱自乐

再例如:
文件夹    孤勇者
改名后变成    44_陈奕迅 - 孤勇者

感觉太复杂了:
要把原文件夹的名字去csv文件中的第四列去查找对比,
实际情况时,子文件夹可能有几十个, 但csv文件第四列的歌, 没有这么多, 只有包含文件夹名时, 才去重命名它

不知道能不能实现, 请求大神支招, 提前感谢!




MP3.csv

排序,语言,歌手,歌名
38,国语,金志文,自娱自乐
39,国语,锤娜丽莎,我太笨
40,国语,鹏鹏、一航,英雄泪
41,国语,张茜,用力活着
37,国语,海来阿木,来跳舞 (中文版)
42,国语,白小白,我爱你不问归期
43,国语,海来阿木,你的万水千山
44,国语,陈奕迅,孤勇者
45,国语,杨小壮,一个人挺好
46,国语,黄静美,无人与我
47,国语,南北组合(吉萍),明月夜
48,国语,洛先生,影子说
49,国语,队长,哪里都是你
发表于 2021-12-20 15:49:47 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2021-12-20 15:53 编辑
  1. @echo off
  2. for /f "tokens=1,3* delims=," %%a in (mp3.csv) do (
  3.     if exist "%%c" ren "%%c" "%%a-%%b - %%c"
  4. )
  5. pause
复制代码
 楼主| 发表于 2021-12-20 16:10:11 | 显示全部楼层
回复 2# qixiaobin0715


    没有任何动静
发表于 2021-12-20 17:12:07 | 显示全部楼层
  1. gc mp3.csv|%{
  2.   $s=$_.split(",")
  3.   if(test-path $s[3]) {
  4.     $new="{0}{1}{2}{3}{4}" -f  $s[0],"_",$s[2],"-",$s[3]
  5.     ren $s[3] $new
  6.   }
  7. }
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1

查看全部评分

 楼主| 发表于 2021-12-20 17:16:34 | 显示全部楼层
本帖最后由 5i365 于 2021-12-20 17:18 编辑

回复 4# for_flr


    报这个错误:
ERROR: Test-Path : Cannot bind argument to parameter 'Path' because it is null.

我新建了rename.ps1放到music文件夹下, 把您的代码放进去执行,
把代码加了.\也不行

gc .\mp3.csv | %{
        $s = $_.split(",")
        if (test-path $s[3])
        {
                $new = "{0}{1}{2}{3}{4}" -f $s[0], "_", $s[2], "-", $s[3]
                ren $s[3] $new
        }
}
 楼主| 发表于 2021-12-20 18:56:03 | 显示全部楼层
本帖最后由 5i365 于 2021-12-20 19:08 编辑

回复 4# for_flr

回显了一下信息, 发现乱码了, 加了编码参数就可以了
    gc .\mp3.csv -Encoding UTF8

但我还是对编码不太理解, 如果我的csv不是utf8, 而是别的什么编码, 怎样能适应所有编码格式的.csv文件呢, 能否用ps查看编码, 然后写个判断?
 楼主| 发表于 2021-12-20 19:06:47 | 显示全部楼层
本帖最后由 5i365 于 2021-12-20 19:16 编辑

回复 4# for_flr


    请问, 如果文件夹的名字是下面这种形式的, 注意, 歌手和歌名间有两个空格, 中间一个-号

金志文 - 自娱自乐
海来阿木 - 来跳舞 (中文版)
陈奕迅 - 孤勇者
--------------------------------------
怎样, 找到在对应在csv中的第一列的序号, 然后把文件夹名, 改为如下的形式呢? 脑子想了半天还是写不出来, 哎

38_金志文 - 自娱自乐
37_海来阿木 - 来跳舞 (中文版)
44_陈奕迅 - 孤勇者
 楼主| 发表于 2021-12-21 06:19:13 | 显示全部楼层
本帖最后由 5i365 于 2021-12-21 06:20 编辑

回复 5# 5i365


    我是这样写的, 不能替换掉:
不明白那个{4} 是做什么用的
  1. gc .\mp3.csv -Encoding UTF8| %{
  2.         $s = $_.split(",")
  3.         $old = "$s[2] - $s[3]"
  4.         $old
  5.         if (test-path $old)
  6.         {
  7.                 $new = "{0}{1}{2}{3}{4}" -f $s[0], "_", $s[2], "-", $s[3]
  8.                 ren $old $new
  9.         }
  10. }
复制代码
发表于 2021-12-21 09:28:49 | 显示全部楼层
回复 7# 5i365
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "tokens=1,3,4 delims=," %%a in (MP3.csv) do (
  4.     if exist "%%b - %%c" ren "%%b - %%c" "%%a_%%b - %%c"
  5. )
  6. pause
复制代码
  1. gc mp3.csv | %{
  2.         $s = $_.split(",")
  3.         $old ="{0}{1}{2}" -f $s[2]," - ",$s[3]
  4.         if (test-path $old){
  5.                 $new = "{0}{1}{2}{3}{4}" -f $s[0],"_",$s[2]," - ",$s[3]
  6.                 ren $old $new
  7.         }
  8. }
复制代码
$a="{0}{1}{2}{3}" -f "hey,","man!"," what are you doing","?"
{0}{1}{2}{3}分别代表-f后面跟着的四个参数,参数之间用逗号隔开
 楼主| 发表于 2021-12-21 11:30:03 | 显示全部楼层
回复 9# for_flr


    终于懂了, 多谢!
 楼主| 发表于 2021-12-21 11:37:02 | 显示全部楼层
回复 9# for_flr


    您好, csv文件, 编码不一定是ansi, 如果不是的话, 要加 -encode 参数才行

怎样能适应所有编码格式的.csv文件呢, 能否用ps查看编码, 然后写个判断?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 06:27 , Processed in 0.023232 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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