Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
windows批处理多任务问题--代码清理_Windows_Arrays_Batch File_Multitasking - Fatal编程技术网

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

windows批处理多任务问题--代码清理,windows,arrays,batch-file,multitasking,Windows,Arrays,Batch File,Multitasking,如果一些windows批处理专家愿意帮助我清理代码,我将不胜感激。 好的.bat正在工作,但是它的实现很混乱,我想在两个方面使它更简单、更清晰: 1-我在上面一行加了一个“sleep 1s”让“copy”完成,否则“for()”似乎与程序的其余部分一起多任务执行,对吗 2-我愿意使用数组来存储文件名,而不是每次都重新列出它们 [如果你想知道:代码在做什么? 它将MP3文件串联在一起:silenes.MP3+inclutions.MP3,以创建一个带有随机性的感应的长音轨] 感谢所有帮助我的人

如果一些windows批处理专家愿意帮助我清理代码,我将不胜感激。 好的.bat正在工作,但是它的实现很混乱,我想在两个方面使它更简单、更清晰:

1-我在上面一行加了一个“sleep 1s”让“copy”完成,否则“for()”似乎与程序的其余部分一起多任务执行,对吗

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

[如果你想知道:代码在做什么? 它将MP3文件串联在一起:silenes.MP3+inclutions.MP3,以创建一个带有随机性的感应的长音轨]

感谢所有帮助我的人



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问题:(不明白这个神秘的问题?所以我暂时保留了模运算)

屈服误差:

/ was unexpected at this time.
我尝试了()更多:
SET/ax=(!RANDOM!*Nb_归纳)/32768)+1
不再成功


1-%%模运算符是整数除法的余数:set/A mod=13%%5等于3;请参阅en.wikipedia.org/wiki/Random\u number\u generation

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

2-我给你看!感应mp3[!x!]!示例仅用于教育目的,但不能使用(正如我在回答中所说)

对,我试着扭转它!感应mp3[!x!]!导入MP3[%x%]!等 仍然无法使用EnableDelayedExpansion内容%a%%%a!A.等等

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

很抱歉给你一个混乱的答复

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


是的,数组非常好/简单,只是%variable%的事情仍然超出了我的控制…

关于代码的一些评论:

@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
)
  • FOR
    命令未并行执行,因此不需要执行
    SLEEP
    命令

  • SET/A
    命令中的变量不需要展开;SET命令本身正确地获取其值

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

  • 批处理中的阵列管理非常简单,如中所述

这是我的代码版本:

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


Antonio

copy是CMD的内部命令,CMD应该等待copy命令返回结果。为什么需要睡眠?数组不太容易仿真-您可以检查此脚本:我知道在这段代码中我不应该有任何并行执行。仍然没有睡眠,我在cmd窗口中看到“进程无法访问该文件,因为它正被另一个进程使用”。在输出文件中,我显然遗漏了第二份!所以我猜有些命令是重叠的,不知道怎么做!!:-(Antonio!非常感谢您的快速回答!(SET/a REP=!RANDOM!%%!MAX_TIME!+!MIN_TIME!可以,因为%%是模运算而不是除法运算)数组[]填充正常,但检索不正常!!代码:echo“DEBUG:copy/B%outputm3%+/B!icpitonmp3[%%x]!/B%outputm3%1>nul“echo”DEBUG:copy/B%outputm3%+/B!icpitonmp3[!x!!/B%OutputMP3%1>nul”结果为:“调试:复制/B输出.mp3+/B/B输出.mp3 1>nul”“调试:复制/B输出.mp3+/B x/B输出.mp3 1>nul”,因此我无法获取!电感mp3[!x!!正确地…硬编码!电感[0]!OkI必须承认,我仍然对%var%,%%var,!var!等感到困惑……我很少写代码,而且大多数时间都是从网上找到的其他代码复制/粘贴。1-
%%
模运算符是整数除法的余数:
set/A mod=13%%5
给出3;参见.2-我显示了
!inclutionmp3[!x!]!
示例仅用于教育目的,但不能使用(正如我在回答中所说)。3-我在代码中添加了一些有助于查找问题的ECHO命令。请再次复制上面的程序,运行它,并以代码格式将输出作为编辑发布到您的问题中(不是在注释中).4-你读过关于数组管理的帖子吗?我想这没那么难,但是可以随便问任何关于它的问题。只要用引号括起变量赋值;我已经在代码中做了。如果你想在我的代码中使用模方法,请确保在“x”中加1随机归纳下标变量,因为模生成0到N-1之间的随机数,数组的元素从1到N。
    copy /B %OutputMP3% + /B !InductionMP3[!x!]! /B %OutputMP3%   1> nul