1

私は、家中で samba と dlna を介してメディアを共有する NAS ボックスにテレビ シリーズの大規模なコレクションを置いています。ランダム機能を有効にするために、次のようにバッチ スクリプトを作成してプレイリスト ファイルを作成しました。

    @Echo Off
    color 0e
    Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING ALL BAT, TXT, M3U, SRT and JPG FILES
    del "playlist.m3u"
    Setlocal EnableDelayedExpansion
    set _tmp=%1
    Set _t0=1
    If ["%CD%"]==["%CD:~0,3%"] Set _t0=0
    For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|find /v ".bat"^|  find /v ".m3u"^|find /v ".txt"^| find /v ".srt"^|find /v ".jpg"') Do (
   Set _t1=%%A
   Set _t2=!_t1:%CD%=!
   Echo !_t2:~%_t0%!)>>playlist.m3u

したがって、これらのバッチ ファイルの 1 つを各ディレクトリ (テレビ番組ごとに 1 つ) と親フォルダー (TV) に配置し、ユーザーは WMP、VLC、または w/e プレーヤーでランダムを有効にして、プレイリストをクリックするだけです。ランダムなもの、より具体的には特定の番組のランダムなエピソードを見る。

それでは、私の質問に進みましょう: パイプ出力がアルファベット順でないのはなぜですか? プログラミングは私の専門知識ではないため、MS-DOS / CMDでこれを実現したいと思っています。これは、スクリプト作成などの私の能力の限界です。FIND コマンドをよりエレガントに使用して、特定のファイルの種類を除外できると思いますが、出力を並べ替えようとする際の問題がそこにあるのではないかと思います。番組固有のプレイリストでさえ、ランダムな並べ替え順になっているように見えます (シーズン内のファイルはアルファベット順ですが、シーズン順はランダムに表示されます)。出力手順。

どんな助けでも大歓迎です。

-TJ

4

3 に答える 3

0

しばらく経ちましたが、これが目的の出力を生成する最終的なバッチ スクリプトです。

@Echo Off
color 0e
Echo PLEASE WAIT, BUILDING PLAYLIST FILE, EXCLUDING BAT, TXT, M3U, SRT and JPG FILES
del "playlist.m3u"
Setlocal EnableDelayedExpansion
Set _t0=1
If ["%CD%"]==["%CD:~0,3%"] Set _t0=0
For /F "tokens=*" %%A In ('Dir "%*" /a-d /b /on /s ^|findstr /v /i ".bat .m3u .txt .srt .jpg"^| sort') Do (
Set _t1=%%A
Set _t2=!_t1:%CD%=!
Echo !_t2:~%_t0%!)>>playlist.m3u

ここに戻るのに時間がかかり申し訳ありませんが、人生は時々邪魔になります。私の希望する出力のサンプルを以下に見つけてください。この方法でのファイル リストは、フォルダーがドライブ文字にマップされているかどうかに関係なく、ネットワークの場所から再生される .m3u プレイリストとして機能します。また、ユーザーがマップするフォルダ階層の場所に関係なく機能します。例:

Z:\md0\media\tv\30 rock\season 1\s01e01.avi
or
y:\tv\30 rock...
or
r:\30 rock...
or even
\\tjmediaserver\video\tv\30 rock\...

ユーザーがこの場所で私のオープン ネットワーク共有にアクセスするためのすべての有効な方法です。バッチ出力の例:

Season 1\30 Rock S01E01 Pilot.avi
Season 1\30 Rock S01E02 The Aftermath.avi
Season 1\30 Rock S01E03 Blind Date.avi

Windows Media Player と VLC (私たちが使用するプレーヤーのみ) は、ファイルが .m3u が保存されているサブディレクトリ内にあると想定しています。番組「X」を最初から見たい場合や、メディア プレーヤーでシャッフルを有効にしてランダムな「x」またはランダムな「x」と「y」を見たい場合に便利です。

于 2014-01-21T00:41:10.240 に答える
0

うーん..

最初のポイント-さまざまな「ランダムな」選択を行うことが意図されている場合、なぜアルファベット順が必要なのですか?

次に - なぜ設定するのですか_tmp- あなたはそれを使用していません。
次へ - あなたの括弧IF "%CD%"...は冗長です - 引用符は、文字列に区切り文字が含まれている可能性があることをバッチに伝えるためにあります
次へ -/onスイッチはDIR、選択されたディレクトリをアルファベット順に出力するように指示します.
次 - _t0「lop 0」または「lop 1」文字を選択することを意図しているように見えますが、DIR /s /b出力は次のようになります-X:\dir...\filename特に賢明ではありません...次 -ケースを作成するためにコマンドからスイッチ
を省略したようです-鈍感。/iFINDfind

ディレクトリ構造を示していないため、「シーズン順」はあいまいです。おそらく、..\showname\season\episode があると思います。シーズン 1、2、..10、11 があるとどうなるか考えてみてください。並べ替えると、1、10、11、2 になります。同じコメントがエピソード名に当てはまる場合があります。

ソートされたリストを作成する方法を次に示します。この場合、現在のすべてのサブディレクトリに含まれるファイルを検出し、選択した拡張子を除いたファイルを検出します。これは、バッチ テスト ディレクトリにand (および)withを含む適切な数のファイル名があるためです。メソッドなしで新しいファイルが作成されることにも注意してください。また、出力ファイル名が異なり、呼び出されません。with&!%delete and appendDELAYEDEXPANSION

@ECHO OFF
SETLOCAL 
(
 For /F "tokens=*" %%A In ('Dir "*with*" /a-d /b /s ^|find /i /v ".bat"^|  find /i /v ".m3u"^|find /i /v ".txt"^| find /i /v ".srt"^|find /i /v ".jpg"^|sort') Do (
ECHO %%A
 )
)>newfile.txt
GOTO :EOF

&コードがどこで壊れているかはわかりません。この構造は気にしません -&と他の難しいキャラクターはとても楽しく行動します。おそらく、あなたの問題は、あなたが示したコードセクションにあります-おそらく後で...

最後に、DIR比較的単純で、名前による除外を許可しません。おそらく、よりエレガントな方法は、

xcopy /y /L /s sourcedir x:\nul\

実験の問題。XCOPY /?ドキュメンテーションのプロンプトから -/exclude:スイッチの使用方法を示します。ただし、2 つの注意点があります。このxcopyアプローチではディレクトリ名が選択され、最後の行はリスト内のファイルの数になります。

 if not exist "%%A\." if exist "%%A" ECHO %%A

この2つの問題を克服する必要があります。

于 2013-08-28T03:23:20.387 に答える