簡體   English   中英

將唯一的文件擴展名掃描到變量中

[英]Scanning unique file extensions into a variable

我有一個包含數萬個文件的 windows 目錄。 我需要將所有唯一文件擴展名的列表放入變量中。

在 Java 程序中,我想掃描該目錄(遞歸地,包括所有子目錄)並檢索可以放入變量的唯一文件擴展名列表。

例如:Dir 包含:File1.txt File2.doc File3.doc File4.doc File5.ppt 我想檢索“txt,doc,ppt”並將其放入字符串變量中(它們不必在數組中分開任何類型的 - 盡管這會起作用。我只需要以一串字符串結束,就像上面的那樣)。

無論如何我可以做到這一點嗎? 可能通過訪問命令行或使用正則表達式?

這是一個 Java 8 示例作為字符串:

        final String extensions = Files.walk(Paths.get(""))
                .map(Path::toString)
                .filter(pathString -> pathString.contains("."))
                .map(pathString -> pathString.substring(pathString.lastIndexOf('.') + 1, pathString.length()))
                .distinct()
                .collect(Collectors.joining(","));

        System.out.println(extensions);

作為數組:


     final String[] extensions = Files.walk(Paths.get(""))
                .filter(Files::isRegularFile)
                .map(Path::toString)
                .filter(pathString -> pathString.contains("."))
                .map(pathString -> pathString.substring(pathString.lastIndexOf('.') + 1, pathString.length()))
                .distinct()
                .toArray(String[]::new);

        System.out.println(Arrays.toString(extensions));

這是一個批處理解決方案:

del %temp%\x.x 2>nul
for /f "tokens=*" %%i in ('dir /s /b /a-d *') do (find "%%~xi" %temp%\x.x ||<nul set/p .= %~xi>>x.x)
set /p ext=<%temp%\x.x
set ext=%ext:.=,%
set ext=%ext:~1%
echo %ext%

對於cmd (批處理文件)解決方案

@echo off

    setlocal enableextensions
    for /r "%cd%" %%a in (*) do if not defined "\%%~xa\" (echo(%%~xa&set ""\%%~xa\"=1")
    endlocal

這通過為每個擴展設置一個變量來使用環境來存儲所見擴展的信息。 如果未設置該變量,則這是第一次找到擴展名並將其回顯到控制台。

編輯以適應我誤讀的評論和OP。 輸出只需要在一行

@echo off

    setlocal enableextensions
    for /r "%cd%" %%a in (*.*) do if not defined "\%%~xa\" (
        set ""\%%~xa\"=1" 
        if not defined "\" (set ""\"=1" ) else (<nul set /p ".=,")
        <nul set /p ".=%%~xa"
    )
    endlocal

與前面的代碼相同的工作,但在這種情況下,輸出保持在一行中,並在需要時添加逗號以分隔擴展列表中的元素

編輯以正確格式化輸出:從擴展中刪除點並將數據存儲在變量中

@echo off

    setlocal enableextensions disabledelayedexpansion 

    for /f "delims=" %%z in ('cmd /e:on /v:off /q /c "for /r "%cd%" %%a in (*.*) do if not defined "\%%~xa\" (set ""\%%~xa\"^=1" & if not defined "\" (set ""\"^=1" ) else (<nul set /p ".^=^,") & <nul set /p ".^=%%~xa" )"') do set "extensionList=%%z"
    set "extensionList=%extensionList:.=%"
    echo(%extensionList%

    endlocal

仍然是相同的代碼,但是為了獲取變量中的數據,所有以前的邏輯都已移到for命令中,因此可以將以前版本的列表分配給變量。 然后從該變量中刪除點以獲得所需的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM