2016-12-04 5 views
1

ランダムなファイルをディレクトリとそのサブディレクトリにバッチで開きたいとします。そして、私はそれのためのコードを与えるstackoverflowに十分な質問があることを知っているが、私はUTF-8文字のサポートで見つかったのどれも。名前にutf-8文字を含むバッチファイルをランダムに選択します。

私はstackoverflowで見つけた次のコードを使用します。

@echo off 
setlocal 
:: Create numbered list of files in a temporary file 
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt" 
dir /b /s /a-d %1 | findstr /n "^" >"%tempFile%" 

:: Count the files 
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N 

call :openRandomFile 

:: Delete the temp file 
del "%tempFile%" 

exit /b 

:openRandomFile 
set /a "randomNum=(%random% %% cnt) + 1" 
for /f "tokens=1* delims=:" %%A in (
    'findstr "^%randomNum%:" "%tempFile%"' 
) do start "" "%%B" 
cmd /k 

それは「blablabla_空色デイズ.MP3」のようなファイルを取り出すまで、その場合には、それはファイル」のようなエラーを与え、細かいそのように動作しますblablabla _ ?????。mp3が見つかりませんでした"これらのファイルは数十種類あります。

私はutf-8を使用するためにファイルの先頭にchcp 65001を使用しようとしましたが、作成したteporary .txtリストには日本語ファイルの正しい名前が表示されますが、ピックアップ自体は、それで@echo offを取り除き、cmdはset /a "randomNum=(%random% %% cnt) + 1"でエラーを出力します。エラー:ゼロ除算。

ファイルがchcp 65001なしですばらしい働きをしているので、この時点では何も起こっていません。 私はバッチを知らないのですが、誰にも実行方法を知っていますか? 私は本当に幸せだろう!

答えて

1

それをテストすることはできませんUTF8/Unicode文字があるときは、findstrやコマンドの出力を持つ多くの問題を持っています関与する。シナリオのこのタイプでは、それらを避けるために、より安全な(しかし遅い)である

それらのいずれかを選択し、ファイルの数をカウントし、選択した数をデクリメントファイルのリストを反復処理を開始、ある
@echo off 
    setlocal enableextensions disabledelayedexpansion 
    rem %1 = folder where to start to list files 
    rem  if empty, current active directory is used 

    rem %2 = file mask 
    rem  if empty * is used 

    rem What to search 
    set "fileMask=%~2" & if not defined fileMask set "fileMask=*" 

    rem Retrieve the number of matching files 
    set "nFiles=0" & for /r "%~f1." %%a in ("%fileMask%") do set /a "nFiles+=1" 
    if %nFiles% lss 1 exit /b 

    rem Select a random file 
    set /a "n=(%random% %% nFiles) + 1" 
    echo Selected file = %n%/%nFiles% 

    rem Count up to the selected file and start it 
    2>nul (
     for /r "%~f1." %%a in ("%fileMask%") do (
      set /a "n-=1", "1/n" || (start "" "%%~fa" & goto :done) 
     ) 
    ) 
:done 

ファイル。 0(選択したファイルに到達した場合)、1/n除算は失敗し、条件付き実行演算子はstartコマンドを実行します。

+0

私は昨日からここに座っていましたが、これは最終的にすべての名前で動作します、ありがとう! – sunnlo

0

私はその短い名前を使用してファイルを開く必要があります:openRandomFile手順で

) do start "" "%%~sB" 

を、試してみました。

申し訳ありませんが - 私は任意のUTF-8のファイル名を持っていないとして、(私が知っていること)

+0

ええ、申し訳ありませんが、ファイルはそのコマンドを実行しません、 'set/a" randomNum =(%random %%%% cnt)+ 1 "'で失敗します。とにかくそれを試してみましたが、IDは動かなかった。 – sunnlo

+0

これは、おそらく 'cnt'が0に設定されていることを示しています。あなたの説明では、'それはそれがうまくいくように、 '...' *エラーを表示し、最初に報告したエラーがその行から生成されると思われるので、示されているように 'start'を修正してください。 – Magoo

+0

それもありましたが、(日本の)名前はもう認識しません。 'cnt'は通常okですが、' chcp 65001'ではなぜですか?ほとんどすべてを試してみましたが、うまくいきません。 – sunnlo

関連する問題