2016-09-18 7 views
0

私はSpotify広告に疲れています。だから私は私自身のプライベート音楽プレーヤーを作りたがっていました。バッチファイル変数はエコーで表示されません

しかし、私は後で見るように問題に遭遇しました。

ここでは、自動(基本的にプレイリスト)または手動(1つの曲のみ再生)の選択肢があります。

しかし、私はコードのこの部分を削除しました。これは問題なく動作していたため、ここでは不要でした。

@echo off 
:auto 
echo Now pick a song to start it off. 

私は著作権上の理由から曲名を削除しました。

echo. 
echo Type 1 for song number one 
echo Type 2 for song number two 
echo Type 3 for song number three 
echo Type 4 for song number four 
echo Type 5 for song number five 
echo. 
set /p songID=Enter songID: 
if %songID%==1 goto Auto1 
if %songID%==2 goto Auto2 
if %songID%==3 goto Auto3 
if %songID%==4 goto Auto4 
if %songID%==5 goto Auto5 

ここでは、以下の変数を入力します。

そして、彼らはトラブルメーカーです!

set song1=Song name 1 
set song2=Song name 2 
set song3=Song name 3 
set song4=Song name 4 
set song5=Song name 5 

私はすべての変数を保持していました。私はちょうどコードの最後を削除しました。

しかし、これはちょうど:Auto2と同じように見えます。

set /a x=xは、曲の長さであり、タイマーの作成に使用されます。

したがって、曲の最後に曲が終了します。 ;)

そして:POSSA1:POSA1は、タイマーを作成します

:Auto1 
cls 
start %user%\Downloads\Songs\"Song name 1.mp3" 
set /a x=248 

:POSSA1 
if %x%==1 goto POSA1 
if %x% gtr 0 (
    echo Now playing %song1% 
    echo. 
    echo %x% Seconds 
    choice /n /c yn /t 1 /d y >nul 
    set /a x-=1 
    cls 
    goto POSSA1 
) 

:POSA1 
if %x% gtr 0 (
    echo Now playing %song1% 
    echo. 
    echo %x% Second 
    choice /n /c yn /t 1 /d y >nul 
    set /a x-=1 
    cls 
    goto POSSA1 
) 

:end 
cls 
taskkill /F /IM WMPlayer.exe 
pause>nul 

をだから私は間違って何をやっていますか?

答えて

1

最初の間違いは、ライン上にある:一般的に

start %user%\Downloads\Songs\"Song name 1.mp3" 

パスとファイル名全体を二重引用符のみファイルの名前のようなだけではなく部分で囲む必要があります。コマンドプロンプトウィンドウcmd /?で実行し、すべての出力ヘルプページを注意深く読んでください。

そして、それは、コマンドプロンプトウィンドウstart /?で実行することによって読み取ることができるよう、二重引用符の最初の文字列は、非常に多くの場合、明示的にそれだけであっても、タイトルを指定する必要があり、オプションのタイトルとしてコマンドSTARTによって解釈されます空のタイトル、つまり""を指定するだけです。だから、正しいコマンドラインは次のようになります。

start "" "%user%\Downloads\Songs\Song name 1.mp3" 

set /a x=248を使用しないことを意味し、環境変数に番号を割り当てるために算術式を使用しないでください。 set "x=248"を使用する方が良いです。

環境変数は常にstring型です。 integer型の環境変数を作成することはできません。 set /a x=248行の場合、Windowsのコマンドプロセッサは、最初に文字列248をCの関数strtolを使用して整数に変換し、数値を文字列に変換して環境変数xに割り当てます。もちろん、数値文字列を文字列として直接環境変数に代入する方が効率的です。

さらに、コマンドSETのパラメータは、variable=stringでも常に二重引用符で囲むことをお勧めします。説明については、あなたのバッチコードの断片を意味するHow to set environment variables with spaces?Why is no string output with 'echo %var%' after using 'set var = text' on command line?

上の回答を参照してください。コマンドプロンプトウィンドウset /?

set "song1=Song name 1" 
set "song2=Song name 2" 
set "song3=Song name 3" 
set "song4=Song name 4" 
set "song5=Song name 5" 

set /p "songID=Enter song ID: " 

ファイル名を指定して実行し、すべての出力のヘルプページをお読みください。 delayed expansionについての情報があります。コマンドブロック内で環境変数が定義または変更され、(で始まり、一致するコードが)で終わり、環境変数の値が同じコマンドブロック内で参照されている場合は、遅延環境変数拡張が常に必要です。

理由は、コマンドがあっても通常又はIF FORコマンドのいずれかであるが実行される前に)に一致する第(から%VariableName%持つすべての環境変数の参照は、参照環境変数の現在の文字列の値によって直ちに交換されることです。そして、この前処理されたコマンドブロックはそれ以上更新されない。

この変数展開の動作は、コマンドプロンプトウィンドウを開い

  • 、コマンドでREMまたはonoffを変更し、それらをコメントアウト、バッチファイルからすべての@echo offまたはecho offを取り除く

    • で見ることができ
    • コマンドプロンプトウィンドウ内から実行するバッチファイルは、バッチファイルを含むディレクトリから、またはフルパスでバッチファイルのファイル名を入力してまた、ファイル拡張子を二重引用符で囲みます。

    は今エコーモードでコマンドプロンプトウィンドウ内からバッチファイルを実行すると、Windowsのコマンドプロセッサが実際に各コマンドを前処理した後、を実行するものの代わりに、それは見ることができます無効にエコーモードと、それをダブルクリックすることで使用可能にそれぞれコマンドブロックである。また、Windowsコマンド・プロセッサーで構文エラーが発生しても、コンソール・ウィンドウが開いたままであるため、エラーが表示されることがあります。

    これは、高度なバッチファイルコーダーでさえ、開発中にバッチコードをデバッグする方法です。問題のコードスニペットは、問題を再現することは有用ではありませんが、ラインset song1=Song name 1は、同じコマンドブロック内にある任意の場所に(て上から始まり、どこでも)の下に終わると、私は何もecho Now playing %song1%によって出力されないと思います

    そのためには、拡大を遅らせています必要です。

    コマンドプロンプトウィンドウでsetlocal /?endlocal /?を実行すると、遅延拡張の使用にも必要な2つのコマンドについてのヘルプが表示されます。

    この回答を読んでわかるように、バッチファイルで使用されるコマンドのヘルプを表示するには、コマンドプロンプトウィンドウからパラメータ/?を指定してコマンドを実行します。バッチファイルの開発には、組み込みのヘルプを使用することをお勧めします。

    最後に、ファイル名をテキストファイル(プレイリストファイル)に入れ、コマンド(出力、再生用などを選択)で処理することをお勧めします。コマンドプロンプトウィンドウfor /?で実行すると、コマンドの詳細については、を参照してください。


    曲リストファイルを使用してプレーヤーをコーディングするためのデモコードです。

    @echo off 
    setlocal EnableExtensions EnableDelayedExpansion 
    set "SongsListFile=C:\Temp\Song List.txt" 
    set "SongFileMissing=0" 
    
    if not exist "%SongsListFile%" goto ListFileError 
    
    cls 
    echo Pick a song to start it off. 
    echo. 
    echo  0 ... play all songs 
    
    rem Output all songs from song list without path and file extension. 
    rem The song number is right aligned with 3 characters width which 
    rem means working for song numbers 1 to 999. 
    
    set "SongNumber=0" 
    for /F "usebackq delims=" %%I in ("%SongsListFile%") do (
        set /A SongNumber+=1 
        set "SongOption= !SongNumber!" 
        set "SongOption=!SongOption:~-3!" 
        echo !SongOption! ... %%~nI 
    ) 
    echo. 
    
    rem Define as default value 0 for playing all songs in case of 
    rem user just hits key RETURN or ENTER and prompt user for number. 
    set "SongSelected=0" 
    set /P "SongSelected=Enter song number (default: %SongSelected%): " 
    echo. 
    
    rem Play all songs if a string was entered by the user not consisting 
    rem of only digits, i.e. the entered string is not a number. 
    for /F "delims=" %%I in ("!SongSelected!") do goto PlayAll 
    
    rem Numbers with leading 0s could be interpreted as octal numbers by 
    rem Windows command processor and therefore better make sure that the 
    rem number string does not have leading zeros. On a number like 0, 00, 
    rem 000, ... play all songs. 
    
    :RemoveLeadingZeros 
    if not "%SongSelected:~0,1%" == "0" goto CheckMaxNumber 
    set "SongSelected=%SongSelected:~1%" 
    if not "%SongSelected%" == "" goto RemoveLeadingZeros 
    goto PlayAll 
    
    rem Windows command processor interprets numbers as signed 32-bit integers 
    rem which limits the range from -2147483648 to 2147483647 whereby only the 
    rem positive range is of interest here at all. The entered number string 
    rem could be longer than what Windows command processor supports. Every 
    rem number with more than 9 digits is interpreted as invalid which reduces 
    rem the valid number range here from 1 to 999999999 which should be always 
    rem enough. And of course the entered number should not be greater than 
    rem the number of song file names in songs list. 
    
    :CheckMaxNumber 
    if not "%SongSelected:~9,1%" == "" goto PlayAll 
    if %SongSelected% GTR %SongNumber% goto PlayAll 
    
    rem For playing a single song skip all lines above the line with the 
    rem song file name to play, play the selected song file and then exit 
    rem the loop without processing the other lines in songs list file. 
    rem skip=0 results in a syntax error and therefore it is necessary to 
    rem define the entire skip option as an environment variable if needed 
    rem because any other than first song in songs list file should be played. 
    
    set "SkipOption=" 
    set /A SongSelected-=1 
    if not "%SongSelected%" == "0" set "SkipOption= skip=%SongSelected%" 
    
    if not exist "%SongsListFile%" goto ListFileError 
    for /F "usebackq%SkipOption% delims=" %%I in ("%SongsListFile%") do (
        call :PlaySong "%%~fI" 
        goto EndPlayer 
    ) 
    
    rem Output error message if songs list file does not exist 
    rem checked every time before reading the lines from this file. 
    
    :ListFileError 
    echo Error: The songs list file "%SongsListFile%" does not exist. 
    set "SongFileMissing=1" 
    goto EndPlayer 
    
    
    rem This is a subroutine embedded in the player's batch file used 
    rem to play the song passed to the subroutine with first argument. 
    
    :PlaySong 
    if not exist "%~1" (
        echo Error: Song file "%~1" does not exist. 
        set "SongFileMissing=1" 
        goto :EOF 
    ) 
    
    echo Playing now song %~n1 ... 
    
    rem Insert here the code used to play the song. 
    
    rem This command results in exiting subroutine and processing of batch 
    rem file continues on the line below the line calling PlaySong. 
    goto :EOF 
    
    
    :PlayAll 
    if not exist "%SongsListFile%" goto ListFileError 
    for /F "usebackq delims=" %%I in ("%SongsListFile%") do call :PlaySong "%%~fI" 
    
    :EndPlayer 
    echo. 
    if not "%SongFileMissing%" == "0" (
        endlocal 
        pause 
    ) else endlocal 
    

    コマンドREMで始まる行はコメントを読んで、特にラインが

    rem Insert here the code used to play the song. 
    

    このラインソングファイル"%~1"を再生するには、コードに置き換える必要があります。

    曲リストファイルC:\Temp\Song List.txtには、パスの有無にかかわらず曲ファイルの名前を含めることができます。たとえば、次のように使用するコマンドを理解するための

    First song.mp3 
    C:\Temp\Another song.mp3 
    Album 1 - Last song .mp3 
    

    とその仕組み、コマンドプロンプトウィンドウを開き、そこに次のコマンドを実行し、完全に非常に慎重に、各コマンドのために表示されているすべてのヘルプページをお読みください。

    • call /?
    • cls /?
    • echo /?
    • endlocal /?
    • for /?
    • goto /?
    • if /?
    • set /?
    • rem /?
    • setlocal /?
    +0

    **ありがとうございます** ** _あなた_ **私のコードに基づいて、重要なビジョンのために。あなたが言ったように、私が提供したコードは十分ではありませんでしたが、私はそれが十分であると言うでしょう、私は同じ問題を抱えていることを確認するためにここに投稿する前にそれをテストしました。コマンドプロンプトで/を使用してthooseコマンドを実行します。 **すべてを注意深く読んでください**。これはたくさんあるかもしれませんが、あなたが説明した最後の部分をどうやって返信してくれますか?ファイル名とtxtファイルと** FOR **コマンドについてのもの!あなたがそうするなら、千回感謝:) @モフィ-_tsgsOFFICIAL_ – tsgsOFFICIAL

    関連する問題