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