如何在单个数字前加{0}

时间:2018-03-24 04:41:35

标签: powershell file-organization

我目前正在将音乐传输到一个mp3播放器,该播放器以不同于ipod的方式组织数字。我需要在单个数字前加0(例如1需要01,2需要02)因为如果单个数字前面没有0并且曲目列表包含更多的歌曲比起13首歌曲的专辑的顺序如下:1,11,12,13,2,3,4,5,6,7,8,9。是否有一个powershell命令,我可以使用它轻松地将0放在单个数字前面而不必手动输入?和/或有没有办法简单地将编号列表添加到文件夹中的歌曲文件,同时保持相同的顺序?或者最后我可以这样做,而不是像1,11,12等组织数字..程序将其订单模式更改为1,2,3,4,5,6,7,8,9,10, 11,12等,即不在单个数字前加0?

谢谢。

2 个答案:

答案 0 :(得分:0)

让我们首先构建一个MWE来重新创建您的场景:

mkdir tmp
cd tmp
FOR /L %i IN (1,1,22) DO echo nothing > my-%i-music-file.mp3

这会创建一个目录,其中包含一些名称为

的假文件

你发出的问题是,不是数字排序,而是按字母顺序排序,因此你可以通过填充零来解决它,你可以使用以下命令来实现:

FOR /L %i IN (1,1,9) DO move my-%i-music-file.mp3 my-0%i-music-file.mp3

当然这解决了我刚刚构建的特定场景,因为您没有提供有关您的详细信息 因此,此地址从19成为0109,但对于您可能需要预先添加的任意数量的零都是如此

答案 1 :(得分:0)

您的播放器按字母顺序排序,可能是因为排序是在包含数字和字母的文件名上完成的。这就是mp3s ++通常嵌入了Track ID / Number属性的原因,它只是一个数字,可以用于数字排序。如果以及如何使用曲目编号属性(如果有)对程序进行排序,则取决于程序。

演示问题以及如何在PowerShell中使用数字排序:

#Sort by filenames -> alphabetical order = problem
"1_ThisSong.mp3", "2_YourSong.mp3","12_MySong-mp3" | Sort-Object
1_ThisSong.mp3
12_MySong-mp3
2_YourSong.mp3

#Extract the number before _, cast to int-type and sort -> Numeri sort is possible
"1_ThisSong.mp3", "2_YourSong.mp3","12_MySong-mp3" | Sort-Object { $_.Split("_")[0] -as [int] }
1_ThisSong.mp3
2_YourSong.mp3
12_MySong-mp3

要在PowerShell中使用两位数显示数字,可以使用字符串格式。例如:

1..13 | ForEach-Object { "{0:00} - MyNewFilename" -f $_ }

01 - MyNewFilename
02 - MyNewFilename
03 - MyNewFilename
04 - MyNewFilename
05 - MyNewFilename
06 - MyNewFilename
07 - MyNewFilename
08 - MyNewFilename
09 - MyNewFilename
10 - MyNewFilename
11 - MyNewFilename
12 - MyNewFilename
13 - MyNewFilename

演示重命名文件,以便数字使用两位数字:

(Get-ChildItem).Name
12_MySong.mp3
1_ThisSong.mp3
2_YourSong1.mp3

Get-ChildItem -Path 'D:\New folder' -Filter "*.mp3" | ForEach-Object {
    $matcheval = {
        param($match)

        #Output number-value as two digits
        "{0:00}" -f ($match.Value -as [int])
    }

    #Replace any number use two-digit-format
    $BaseName = [regex]::Replace($_.BaseName,"\d+",$matcheval)

    #Rename file with updated basename
    Rename-Item -Path $_.FullName -NewName "$BaseName$($_.Extension)"

}

(Get-ChildItem).Name
01_ThisSong.mp3
02_YourSong01.mp3
12_MySong.mp3