2014-03-30 33 views
0

所以我一直在嘗試編寫一個腳本,能夠回顯目錄中所有文件(包括子目錄)的所有文件路徑。Windows批處理文件將目錄中的所有文件路徑回顯爲具有特殊字符的文件

我想出這個至今:

SETLOCAL ENABLEDELAYEDEXPANSION 
for /f "delims=" %%F IN ('dir /b /s /B *.java') do (
    SET "str123=%%~F" 
    echo "!str123:\=/!" >> sources.txt 
) 

這個工程,我希望它只是其中的文件路徑包含特殊字符,如「º」的情況。當這種特殊情況發生時.txt文件中的字符被替換爲'§'。試圖爲這個源文件運行javac將會失敗(它說文件丟失)。如果我打開文本文件並用'º'代替所有§,它將起作用。 有什麼辦法來改進我的腳本來處理這些情況?

回答

2

這是FOR/F的已知問題 - 它不處理未映射到當前代碼頁的unicode字符。

但/ R不:-)

工作在起飛的機會,一個文件名可能包含!,你應該開啓或關閉您的循環中延遲擴展。如果啓用延遲擴展,則包含!的變量在擴展時會損壞。

您的代碼在每次迭代中重新打開一次輸出文件。打開和定位寫入光標需要時間。如果將整個FOR語句包含在一組額外的括號中並只重定向一次,則性能會更好。這也允許你使用正常的重定向(不是追加模式),所以你的輸出文件每次都可以開始清空。

@echo off 
setlocal disableDelayedExpansion 
(for /r %%F in (*.java) do (
    set "file=%%F" 
    setlocal enableDelayedExpansion 
    echo "!file:\=/!" 
    endlocal 
)) >sources.txt 

使用FOR/R,而不是與DIR FOR/F的唯一缺點/ S的是,你不能得到系統或隱藏的文件這種方式。但是你的原始代碼無論如何都沒有獲取系統或隱藏文件。

爲了將來的參考,如果您使用dir /a,可以使用DIR命令包含系統文件和隱藏文件。使用沒有任何屬性的/a會導致DIR接受所有屬性。

+0

我試着複製粘貼該腳本並運行它,'º'仍然被'§'取代(因此導致javac不編譯)。也許我做錯了什麼? – Cacau

相關問題