Board logo

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

作者: 5i365    时间: 2021-12-20 15:06     标题: PowerShell如何用csv文件中的几个字段拼成的字符去重命名文件夹

一图顶千文:如下图所示:

在 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,国语,队长,哪里都是你

作者: qixiaobin0715    时间: 2021-12-20 15:49

本帖最后由 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
复制代码

作者: 5i365    时间: 2021-12-20 16:10

回复 2# qixiaobin0715


    没有任何动静
作者: for_flr    时间: 2021-12-20 17:12

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

作者: 5i365    时间: 2021-12-20 17:16

本帖最后由 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
        }
}
作者: 5i365    时间: 2021-12-20 18:56

本帖最后由 5i365 于 2021-12-20 19:08 编辑

回复 4# for_flr

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

但我还是对编码不太理解, 如果我的csv不是utf8, 而是别的什么编码, 怎样能适应所有编码格式的.csv文件呢, 能否用ps查看编码, 然后写个判断?

作者: 5i365    时间: 2021-12-20 19:06

本帖最后由 5i365 于 2021-12-20 19:16 编辑

回复 4# for_flr


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

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

38_金志文 - 自娱自乐
37_海来阿木 - 来跳舞 (中文版)
44_陈奕迅 - 孤勇者

作者: 5i365    时间: 2021-12-21 06:19

本帖最后由 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. }
复制代码

作者: for_flr    时间: 2021-12-21 09:28

回复 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后面跟着的四个参数,参数之间用逗号隔开
作者: 5i365    时间: 2021-12-21 11:30

回复 9# for_flr


    终于懂了, 多谢!
作者: 5i365    时间: 2021-12-21 11:37

回复 9# for_flr


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

怎样能适应所有编码格式的.csv文件呢, 能否用ps查看编码, 然后写个判断?





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