把以下那句
for %%i in (*.mp3)do set "#!random!=%%i"
改成
for /f "delims=" %%i in ('dir /a-d/b *.mp3') do set "#!random!=%%i"
您这个代码出现部分文件没有重命名,是因为之前那句命令没有完整列出所有文件,所有导致重命名漏了。
以下代码复制粘贴到记事本,另存为xx.bat,编码选ANSI,跟要处理的文件放一起双击运行
<# :
cls
@echo off
mode con lines=5000
rem 将当前目录里的文件顺序随机打乱后在名称开头添加递增的数字序号
set #=Any question&set @=WX&set $=Q&set/az=0x53b7e0b4
title %#% +%$%%$%/%@% %z%
cd /d "%~dp0"
powershell -NoProfile -ExecutionPolicy bypass "Invoke-Command -ScriptBlock ([ScriptBlock]::Create([IO.File]::ReadAllText('%~f0',[Text.Encoding]::GetEncoding('GB2312')))) -Args '%~f0'"
echo;%#% +%$%%$%/%@% %z%
pause
exit
#>
$ext=@(".mp3");
$len=4;
$self=get-item -liter $args[0];
$path=$self.Directory.FullName;
$arr=@(dir -liter $path|?{($ext -contains $_.Extension) -and ($_ -is [System.IO.FileInfo])}|%{$_.Name});
for($i=0;$i -lt $arr.length;$i++){
$oldfile=$path.trimend('\')+'\'+$arr[$i];
$newfile=$path.trimend('\')+'\#'+$arr[$i];
move-item -liter $oldfile $newfile;
};
$brr=@(get-random -input $arr -count $arr.length);
for($i=0;$i -lt $brr.length;$i++){
$newName=($i+1).toString().PadLeft($len, '0')+'_'+($brr[$i] -replace '^\d+_');
$oldfile=$path.trimend('\')+'\#'+$brr[$i];
$newfile=$path.trimend('\')+'\'+$newName;
write-host ($brr[$i]+' --> '+$newName);
move-item -liter $oldfile $newfile;
}