首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >windows批处理多任务问题.代码清理

windows批处理多任务问题.代码清理
EN

Stack Overflow用户
提问于 2013-01-09 18:22:03
回答 1查看 307关注 0票数 1

如果一些windows批处理专家愿意帮助我清理代码,我会很感激。 Ok .bat正在工作,但它是混乱的实现,我想让它更简单、更简洁:

我放了一个“睡眠1”,让上面一行的“拷贝”完成,否则"for ()“似乎与程序的其他部分一起多任务执行,对吗?

我愿意使用数组来存储文件名,而不是每次都重新列出它们!

如果你想知道:代码在做什么?它正在连接MP3文件: silences.mp3 + inductions.mp3,以创建一个带有一些随机性的诱惑力的长轨迹

感谢任何人的帮助!

代码语言:javascript
运行
复制
@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 (1谢谢),您的代码输出:

代码语言:javascript
运行
复制
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问题:(不明白这个神秘的吗?)所以我现在一直保持模块操作)

代码语言:javascript
运行
复制
SET /a x=(!RANDOM! * Nb_induction) / 32768 + 1

屈服误差:

代码语言:javascript
运行
复制
/ was unexpected at this time.

我试了()更多:SET /a x=((!RANDOM! * Nb_induction) / 32768 ) + 1不再成功!

1- %模块化运算符是整数除法的剩余部分: set /A mod=13 %% 5给出3;请参阅/A

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

我展示了!InductionMP3!x!例如,只是为了教育目的,但不能使用(正如我在回答中所说)。

对,我试着扭转它!InductionMP3!X!等等。仍然没有得到它与EnableDelayedExpansion的东西%a !a!等等。

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

抱歉你的回答太乱了

你看过关于数组管理的文章了吗?我认为这并不难,但你可以随便问一些问题。

我做了,数组很好/很简单,只是%变量%的事情还在我的控制之外.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-09 22:14:04

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

  • FOR命令不是在paralell中执行的,因此不需要SLEEP命令。
  • SET /A命令中的变量不需要展开;SET命令本身正确地接受它的值。
  • 分割不是个好主意!随机!最大限度。限制并得到余数,因为得到的数字不具有相同分布的原始!随机!,所以您可能会得到相同结果的多次重复。正确的使用方式!随意!如下所示。
  • this post所述,批处理中的数组管理非常简单。

这是我的代码版本:

代码语言:javascript
运行
复制
@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命令中,随机归纳文件的名称如下所示:

代码语言:javascript
运行
复制
    copy /B %OutputMP3% + /B !InductionMP3[!x!]! /B %OutputMP3%   1> nul

但是,不可能在另一个扩展中嵌套延迟扩展,因此使用FOR命令来实现第一个扩展并在第二个扩展中使用它的可替换值。有关详细信息,请参阅前面的链接。

安东尼奥

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14243875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档