如果某些 Windows批处理大师愿意帮我清理代码,我将不胜感激。 好的.bat正在运行,但它的实现很混乱,我想让它更简单,更清晰:
1 - 我已经“睡了1秒”让上面一行的“复制”完成,否则似乎“for()”与程序的其余部分一起执行,是对吗?
2 - 我愿意使用数组来存储文件名,而不是每次都重新列出它们!
[如果你想知道:代码在做什么? 它连接MP3文件:silences.mp3 + inductions.mp3创建一个带有一点随机性的导入的长轨道]
感谢任何人的帮助!@ECHO OFF
CLS
SETLOCAL EnableExtensions EnableDelayedExpansion
REM ----------- SET VALUES -----------
REM RECOMMENDED FORMAT : MP3 CBR 16kHz --> 8kbps silence & 16kbps voice
SET Folder=.\inductions\
SET SilenceMP3=1s-blank.mp3
SET OutputMP3=output.mp3
REM ----------- GET USER INPUTS -----------
SET /p MAX_TIME=Maximum time seconds :
SET /p MIN_TIME=Minimum time seconds :
SET /p LOOP=Nombre de repetitions :
SET /a MAX_TIME-=MIN_TIME
REM ----------- COUNTING NB OF INDUCTION AVAIL -----------
SET Nb_induction=0
for /r "%folder%" %%a in (*.*) do ( SET /a Nb_induction+=1 )
REM ----------- INIT THE OUTPUT WITH 1s SILENCE -----------
copy /Y %SilenceMP3% %OutputMP3% 1> nul
for /L %%i IN (0,1,%LOOP%) do (
REM ----------- GET A RANDOM TIME SILENCE -----------
SET /A REP=!RANDOM! %% !MAX_TIME! + !MIN_TIME!
REM ----------- ADD !REP! seconds of silence -----------
for /L %%j IN (0,1,!REP!) do (
copy /B %OutputMP3% + /B %SilenceMP3% /B %OutputMP3% 1> nul
)
sleep 1
REM ----------- ADD RANDOM INDUCTION -----------
SET /a x=!RANDOM! %% %Nb_induction%
for /r "%folder%" %%a in (*.*) do (
IF !x!==0 ( SET InductionMP3=%%a )
SET /a x-=1
)
copy /B %OutputMP3% + /B !InductionMP3! /B %OutputMP3% 1> nul
echo %%i
)
Antonio(第一次感谢),您的代码输出:
Maximum time seconds : 20
Minimum time seconds : 10
Nombre de repetitions : 2
AVAILABLE INDUCTION FILES:
InductionMP3[1]=D:\auto-induction\inductions\je_sors_de_mon_corps1.mp3
InductionMP3[2]=D:\auto-induction\inductions\je_sors_de_mon_corps2.mp3
InductionMP3[3]=D:\auto-induction\inductions\je_sors_de_mon_corps3.mp3
RANDOM INDUCTION # 1: D:\auto-induction\inductions\je_sors_de_mon_corps1.mp3
copy /B output.mp3 + /B D:\auto-induction\inductions\je_sors_de_mon_corps1.mp3 /
B output.mp3
0
RANDOM INDUCTION # 1: D:\auto-induction\inductions\je_sors_de_mon_corps1.mp3
copy /B output.mp3 + /B D:\auto-induction\inductions\je_sors_de_mon_corps1.mp3 /
B output.mp3
1
RANDOM INDUCTION # 2: D:\auto-induction\inductions\je_sors_de_mon_corps2.mp3
copy /B output.mp3 + /B D:\auto-induction\inductions\je_sors_de_mon_corps2.mp3 /
B output.mp3
2
cmd问题:(不明白这个神秘的一个?所以我现在保持模数运算)
SET /a x=(!RANDOM! * Nb_induction) / 32768 + 1
产量错误:
/ was unexpected at this time.
我试过()更多:SET /a x=((!RANDOM! * Nb_induction) / 32768 ) + 1
没有更多成功!
1- %% modulo运算符是整数除法的余数:set / A mod = 13 %% 5赋予3;见en.wikipedia.org/wiki/Random_number_generation。
同意,你的解决方案是正确的数学/统计实现(如果胜利可以正确处理乘法/除法;-))
2-我展示了!InductionMP3 [!x!]!例子仅用于教育目的,但不能使用(正如我在答案中所述)。
是的,我试图扭转它!InductionMP3 [!x!]!,!InductionMP3 [%x%]!等等... 仍然没有得到EnableDelayedExpansion的东西%a %%% a!a!等...
3-我在代码中添加了一些ECHO命令,有助于发现问题。请再次复制上面的程序,运行它并以代码格式将输出作为编辑发布在您的问题中(不在评论中)。
对于凌乱的回复抱歉
4-您是否阅读过有关阵列管理的帖子?我认为这并不困难,但随时可以提出任何问题
我做了,数组非常好/很容易,只是%变量%的东西仍然无法控制......
答案 0 :(得分:2)
有关您的代码的一些评论:
FOR
命令未在并行执行,因此不需要SLEEP
命令。
SET /A
命令中的变量不需要扩展; SET命令正确地自行获取其值。
划分不是一个好主意!随机!最大的限制并得到余数,因为得到的数字与原始数据的分布不同!RANDOM!,因此您可能会多次重复相同的结果。正确的使用方式!随机!如下所示。
Batch中的数组管理非常简单,如this post中所述。
这是我的代码版本:
@ECHO OFF
CLS
SETLOCAL EnableExtensions EnableDelayedExpansion
REM ----------- SET VALUES -----------
REM RECOMMENDED FORMAT : MP3 CBR 16kHz --> 8kbps silence & 16kbps voice
SET Folder=.\inductions\
SET SilenceMP3=1s-blank.mp3
SET OutputMP3=output.mp3
REM ----------- GET USER INPUTS -----------
SET /p MAX_TIME=Maximum time seconds :
SET /p MIN_TIME=Minimum time seconds :
SET /p LOOP=Nombre de repetitions :
SET /a MAX_TIME-=MIN_TIME
REM ----------- COUNTING NB OF INDUCTION AVAIL -----------
REM -- AND CREATE THE INDUCTION ARRAY AT THE SAME TIME --
ECHO AVAILABLE INDUCTION FILES:
SET Nb_induction=0
for /r "%folder%" %%a in (*.*) do (
SET /a Nb_induction+=1
SET InductionMP3[!Nb_induction!]=%%a
ECHO InductionMP3[!Nb_induction!]=%%a
)
REM ----------- INIT THE OUTPUT WITH 1s SILENCE -----------
copy /Y %SilenceMP3% %OutputMP3% 1> nul
for /L %%i IN (0,1,%LOOP%) do (
REM ----------- GET A RANDOM TIME SILENCE -----------
SET /A "REP=(!RANDOM! * MAX_TIME) / 32768 + MIN_TIME"
REM ----------- ADD !REP! seconds of silence -----------
for /L %%j IN (0,1,!REP!) do (
copy /B %OutputMP3% + /B %SilenceMP3% /B %OutputMP3% 1> nul
)
REM sleep 1 NOT REQUIRED
REM ----------- ADD RANDOM INDUCTION -----------
SET /a "x=(!RANDOM! * Nb_induction) / 32768 + 1"
for %%x in (!x!) do (
ECHO RANDOM INDUCTION # %%x: !InductionMP3[%%x]!
ECHO copy /B %OutputMP3% + /B !InductionMP3[%%x]! /B %OutputMP3%
copy /B %OutputMP3% + /B !InductionMP3[%%x]! /B %OutputMP3% 1> nul
)
echo %%i
)
请注意,在上一个COPY
命令中,随机归纳文件的名称将是这样的:
copy /B %OutputMP3% + /B !InductionMP3[!x!]! /B %OutputMP3% 1> nul
但是,不可能将延迟扩展嵌套在另一个扩展中,因此FOR
命令用于实现第一次扩展并在第二次扩展中使用其可替换值。有关详细信息,请参阅上一个链接。
安东尼奥