我有一台 mp3 播放器,它有一个设计很差的硬编码随机生成器,用于随机播放歌曲。每次打开它,它都会播放相同的顺序(5-22-3-150-75-86... 等)。为了听到更多变化,我希望能够定期随机化 USB 记忆棒上的文件名并更改文件在目录列表中的位置。
我正在尝试将子目录中的所有文件名重命名为随机数。这是我一直在尝试的方法,但没有成功。出于某种原因新文件名中的 %num% 为空白。
1| for %%A in (*.mp3) DO (
2| set /A num=%RANDOM%*100/32768+1
3| ren "%%A" %num%.mp3
4| )
5| pause
(讨论过程中为清晰起见添加了行号)
每个文件的输出如下所示。
D:\music_playlists\pop-mix [25gb]>(
set /A num=13621*100/32768+1
ren "Country-132.mp3".mp3
)
存在重复的文件名,或者
找不到该文件。
正如你所看到的%NUM% 未扩展为第 3 行的文件名...
我需要做什么?
更新 - 不确定到底发生了什么,但这似乎有效,即使回声显示空白字段
SETLOCAL EnableDelayedExpansion
FOR %%A IN (*.mp3) DO (
SET /A NUM=!RANDOM!
echo !NUM!
REN "%%A" !NUM!.mp3
)
PAUSE
答案1
尝试实现延迟扩展并将与和 一起%
使用的符号更改为点:RANDOM
NUM
!
SETLOCAL EnableDelayedExpansion
FOR %%A IN (*.mp3) DO (
SET /A NUM=!RANDOM!*100/32768+1
REN "%%A" !NUM!.mp3
)
PAUSE
答案2
如果已经选择了随机数,是否有任何文件具有相同的名称?因此,将失败
一般来说,是的,因此在这些情况下,您将需要获取另一个随机数来使用唯一的名称/编号重命名文件。
我可以建议将小数点后两位的范围进一步扩大,从而尽量减少重命名文件时重复的可能性吗?
@echo Off && SetLocaL EnableDelayedExpansion
for /f delims^=* %%i in =;(
'dir /on /a:-d /b "*.mp3"'
=;) do call %:^) "%%~dpi" "%%~nxi"
endlocal && goto :eof || exit /b 0
%:^)
for /f %%f in =;(
'set /a _num^=!random!*1000/32768+1'
=;) do set "_num=100%%~f"
if not exist "%~1!_num:~-4!.mp3" =;(
ren "%~1%~2" "!_num:~-4!.mp3"
exit /b =;) else goto %:^)