1

一部のWindowsバッチの第一人者が、コードのクリーンアップを喜んで手伝ってくれるとありがたいです。 .batは機能していますが、実装が面倒です。2つの点でよりシンプルでクリーンなものにしたいと思います。

1-上記の行の「コピー」を完了するために「sleep1s」を入れました。そうでない場合、「for()」はプログラムの残りの部分とマルチタスクで実行されているようです。

2-毎回ファイル名を再リストするのではなく、配列を使用してファイル名を保存したいと思います!

[疑問に思うなら:コードは何をしているのですか?MP3ファイルを連結しています:silences.mp3+ductions.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
    )

アントニオ(最初の感謝)、あなたのコード出力:

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!等...

3-問題を見つけるのに役立ついくつかのECHOコマンドをコードに追加しました。上記のプログラムをもう一度コピーして実行し、質問の編集としてコード形式で出力を投稿してください(コメントではありません)。

面倒な返信でごめんなさい

4-アレイ管理に関する投稿を読みましたか?それほど難しいことではないと思いますが、お気軽にご質問ください。

私はそうしました、配列は非常に大丈夫/簡単です、それはまだ私の制御の及ばない%variable%のものです...

4

1 に答える 1

2

コードに関するいくつかのコメント:

  • FORコマンドは並列実行されないため、SLEEPコマンドは不要です。

  • コマンド内の変数はSET /A展開する必要はありません。SET コマンドは、それ自体で値を正しく取得します。

  • !RANDOM! を分割するのは得策ではありません。最大で。結果の数値は元の !RANDOM! と同じ分布を持たないため、制限して残りを取得します。そのため、同じ結果が複数回繰り返される可能性があります。!RANDOM! の正しい使い方 を以下に示します。

  • この投稿で説明されているように、Batch での配列管理は非常に単純です。

これはあなたのコードの私のバージョンです:

@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コマンドを使用して最初の展開を実現し、2 番目の展開でその置き換え可能な値を使用します。詳細については、前のリンクを参照してください。

アントニオ

于 2013-01-09T22:14:04.660 に答える