1

如果一些Windows 批处理大师愿意帮助我清理我的代码,我将不胜感激。 好的 .bat 正在工作,但它的实现很混乱,我想让它在两件事上更简单和更干净:

1-我已经放了一个“sleep 1 s”让上面那行的“复制”完成,否则似乎“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- %% 模运算符是整数除法的余数: set /A mod=13 %% 5 给出 3;请参阅 en.wikipedia.org/wiki/Random_number_generation。

同意,您的解决方案是正确的数学/统计实现(如果 win 可以正确处理乘法/除法;-))

2- 我展示了 !InductionMP3[!x!]! 示例仅用于教育目的,但不能使用(正如我在回答中所说)。

对,我试着把它扭曲一下!InductionMP3[!x!]!, !InductionMP3[%x%]!等等...仍然无法使用 EnableDelayedExpansion 的东西 %a% %%a !a! ETC...

3- 我在代码中添加了一些 ECHO 命令来帮助发现问题。请再次复制上面的程序,运行它并以代码格式发布输出作为您问题的编辑(不在评论中)。

抱歉回复乱七八糟

4- 你读过关于阵列管理的帖子吗?我认为这并不难,但请随时提出任何问题

我做到了,数组非常好/容易,只是 %variable% 的事情仍然超出我的控制范围......

4

1 回答 1

2

关于您的代码的一些评论:

  • FORcommand 不会并行执行,因此SLEEP不需要 command。

  • 命令中的变量SET /A不需要扩展;SET 命令正确地自行获取其值。

  • 划分 !RANDOM! 不是一个好主意!最大。限制并获得余数,因为结果数与原始 !RANDOM! 的分布不同,因此您可能会得到相同结果的多次重复。使用 !RANDOM! 的正确方法!如下图所示。

  • 批处理中的数组管理非常简单,如本文所述。

这是我的代码版本:

@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命令来实现第一个扩展并在第二个扩展中使用其可替换值。有关详细信息,请参阅上一个链接。

安东尼奥

于 2013-01-09T22:14:04.660 回答