2017-01-17 54 views
2

我試圖完成自己的文件資源管理器時遇到問題。 這是我工作目錄中的文件。我想它返回:批處理文件 - Dir的結果分開

FolderFoo  FileFoo 
FolderBar  FileBar 

但是我的腳本返回:

FolderFoo FolderBar FileFoo FileBar 

是否有人有一些想法?這裏是我的腳本:

echo.|set /p some=>"%~Dp0foo\bar\FileExprTemp.tmp" 

for /F "tokens=*" %%a in ('dir /B') do (
    echo.|set /p some="%%a ">>%~Dp0foo\bar\FileExprTemp.tmp 
) 

type %~dp0foo\bar\FileExprTemp.tmp 
+0

什麼是一個新行規則? 'dir/b'只列出了當前目錄的文件和目錄,而不是子文件夾 – jeb

+0

哦,我只是指在工作目錄中的文件,而不是在子文件夾中的文件將編輯問題 – SteveFest

+0

應該是什麼格式?文件夾左側,文件正確嗎? 2行一般? – geisterfurz007

回答

3

甚至沒有細化的過程,但是這顯示瞭如何處理並行讀取兩個列表,同時限制「格式化」輸出。

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem Get root folder from command line - Default to current directory 
    for %%a in ("%~f1.") do set "root=%%~fa" 

    rem Prepare padding for directories column 
    set "folderWidth=30" 
    setlocal enabledelayedexpansion 
    set "padding= " 
    for /l %%a in (1 1 %folderWidth%) do set "padding=!padding! " 
    endlocal & set "padding=%padding%" 

    rem Prepate two files to store files and directories lists 
    for %%d in ("%temp%\directories.%random%%random%%random%.tmp") do (
    for %%f in ("%temp%\files.%random%%random%%random%.tmp") do (

     rem Retrieve the list of directories and files into the temp files 
     dir "%root%" /b /on /ad > "%%~fd" 2>nul 
     dir "%root%" /b /on /a-d > "%%~ff" 2>nul 

     rem Assign each temporary file to a separate stream 
     rem and call the code to process them 
     9<"%%~fd" 8<"%%~ff" call :dumpPairs 

     rem Clean up temporary files 
    ) & del /q "%%~ff" 
    ) & del /q "%%~fd" 

    rem All done, leave 
    goto :eof 


    rem Read stream 9 to retrieve folder name - Clean var on failure 
    rem Read stream 8 to retrieve file name - Clean var on failure 
    rem If both variables are uninitialized, there is nothing more to do 
    rem Concatenate folder name and padding 
    rem Echo the padded folder name and file name 
    rem Repeat the process 

:dumpPairs 
    <&9 set /p "directory=" || set "directory=" 
    <&8 set /p "file="  || set "file=" 
    if not defined directory if not defined file goto :eof 

    set "line=%directory%%padding%" 
    setlocal enabledelayedexpansion 
    echo(!line:~0,%folderWidth%! !file! 
    endlocal 

    goto :dumpPairs 
+0

,我發現2個流對我來說是不夠的,因爲桌面上有太多的文件....是否有添加一些更多隻保存特定文件類型的流? – SteveFest

3

各地工作和測試,並試圖和高爾夫後,我得到了(有點)工作代碼:

@echo off 
setlocal EnableDelayedExpansion 
set counter=0 
for /f "delims=" %%d in ('dir /ad /b') do (
set outputs[!counter!]=%%d 
set /a counter=!counter!+1 
) 
set counter=0 
for /f "delims=" %%f in ('dir /a-d /b') do (
call echo %%outputs[!counter!]%%   %%f >> FileExprTemp.tmp 
set /a counter=!counter!+1 
) 
type FileExprTemp.tmp 

說明:

讀命令的內容dir /ad /b只有目錄作爲內容(包括...)列入清單outputs

閱讀'dir /a-d /b'命令的內容,其明確地將不包括目錄和echo它與已存在的列表內容一起放入臨時文件中。

type該文件的內容。

上述問題:格式。沒有什麼可以讓它看起來像一張桌子或任何東西。除了你的文件夾名稱長度一樣...然後你是一個很好的排序人!

我希望這是足夠的模板工作,並使其符合您的近距離願望!

3

這是我的部分解決方案。

就像geisterfurz007說的,麻煩是格式化。 但是,這並排組合文件和目錄。 也許它會幫助你取得進展?

@echo off & goto :main 

:WriteLine [%1|Skip] 
    setlocal 

    :: Apparently for /F "skip=0" is an error, 
    :: So I have to check for skip=0, and avoid that. 
    :: (To me, that is a bug, as skip=0 should be perfectly valid) 
    if %1 GTR 0 set SKIP_CMD="skip=%1" 
    for /F %SKIP_CMD% %%a in (Dirs.txt) do (set DIRNAME=%%a & goto :doFile) 
    :doFile 
    for /F %SKIP_CMD% %%a in (Files.txt) do (set FILENAME=%%a & goto :doOutput) 
    :doOutput 

    echo %DIRNAME% %FILENAME% >> FileExprTemp.tmp 
exit /B 



:main 
    dir /B /AD > Dirs.txt    &:: Get all the Directories into one file 
    for /F "tokens=3" %%a in ('find /V /C "" Dirs.txt') do set DIR_COUNT=%%a 

    dir /B /A-D > Files.txt    &:: Get all the files into a different file 
    for /F "tokens=3" %%a in ('find /V /C "" files.txt') do set FILE_COUNT=%%a 


    for /L %%a in (0,1,%FILE_COUNT%) do (call :WriteLine %%a) &:: Append each Directory and Filename to Output 

    type FileExprTemp.tmp    &:: Show the results 
    del dirs.txt      &:: Clean up temporary files 
    del files.txt 
exit /B 
+0

是啊,完成整個計劃。 (鍛鍊留給讀者)。目的是比較DIR_COUNT和FILE_COUNT,找出哪一個更大,並適當改變行爲。但是,這應該是一個體面的輪廓,說明如何在兩列中交錯Dirs和文件。 – abelenky

0

我想你的子文件夾中有多個文件。

代碼:

@echo off 

set /p Parent=Type parent folder location ^> 

for /d %%D in ("%Parent%\*") do (
    <nul set /p =%%~nxD 
    for /f "tokens=1-2 delims=:" %%F in ('dir /b "%%~fD" ^| findstr /n .') do (
     if "%%F"=="1" (echo( %%G) else (echo(  %%G) 
    ) 
    echo. 
) 

pause>nul 

使用<nul set /p將允許您打印一個字符串沒有你的字符串後面添加新行。

我認爲有更簡單的方法,我想不出來。

+0

我認爲沒有理由啓用延遲擴展,因爲我沒有看到任何變量擴展 – SteveFest

0

由於問題是制定了,這個簡單的行應該做的:

dir /d|findstr /bvc:" " 

dir /d做表的東西(甚至需要照顧的文件名lenght的),findstr /bvc:" "刪除標題和摘要。

只有文件夾:

dir /d /ad|findstr /bvc:" " 

只有文件:

dir /d /a-d|findstr /bvc:" "