2016-12-04 86 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

你將有很多的問題,findstr和命令輸出時UTF8/Unicode字符參與其中。在這種類型的場景是比較安全的(但速度較慢),以避免它們

@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

我想嘗試

) do start "" "%%~sB" 
:openRandomFile程序

,應使用其短名稱打開該文件。

對不起 - 我沒有任何UTF-8的文件名(我知道)不能測試它

+0

嗯,很抱歉,但文件沒有得到執行該命令,它在'set/a「randomNum =(%random%%% cnt)+ 1」'時失敗。無論如何嘗試過,但ID沒有奏效。 – sunnlo

+0

這可能表明'cnt'被設置爲0.在你的描述中,你會說'它工作的很好,直到它選擇一個文件像......'所以恢復給你的條件* *錯誤並按照指示修改'start',因爲看起來您最初報告的錯誤將從該行生成。 – Magoo

+0

也這樣做了,但之後它不再識別(日語)名稱。爲什麼'cnt'通常沒問題,而在'chcp 65001'中呢?幾乎所有嘗試,但它不起作用。 – sunnlo