2017-01-17 2 views
2

Ich stieß auf ein Problem beim Versuch, meinen eigenen Datei-Explorer zu beenden. Dies sind die Dateien in meinem Arbeitsverzeichnis. Ich möchte es zurück:Batch-Datei - Dirs Ergebnis getrennt

FolderFoo  FileFoo 
FolderBar  FileBar 

aber mein Skript zurückgibt:

FolderFoo FolderBar FileFoo FileBar 

Hat jemand eine Idee haben? Hier ist mein Skript:

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

Was ist die Regel für eine neue Zeile? 'dir/b' listet nur die Dateien und Verzeichnisse des aktuellen Verzeichnisses auf, nicht aus den Unterverzeichnissen – jeb

+0

Oh, ich meine nur die Dateien im Arbeitsverzeichnis, nicht die in Unterordnern, wird die Frage bearbeiten – SteveFest

+0

Was soll das Format sein? Ordner links, Dateien richtig? 2 Zeilen im Allgemeinen? – geisterfurz007

Antwort

3

Nicht einmal ein verfeinerter Prozess, aber das zeigt, wie das Lesen der zwei Listen parallel behandelt wird, während eine "formatierte" Ausgabe bereitgestellt wird.

@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

sehe und ich fand 2 Streams sind nicht genug für mich, weil es viel zu viele Dateien auf dem Desktop gibt .... Gibt es trotzdem einige hinzuzufügen mehr Streams, die nur bestimmte Dateitypen enthält? – SteveFest

3

Nach der Arbeit um und das Testen und Ausprobieren und Golf Ich habe einen (etwas) Arbeitscode:

@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 

Erläuterung:

Lesen Sie den Inhalt des Befehls dir /ad /b, die nur die Verzeichnisse als Inhalt enthält (einschließlich . und ..) in die Liste outputs

Lesen Sie den Inhalt des Befehls 'dir /a-d /b' die explizit enthält Verzeichnisse und echo es zusammen mit den bereits vorhandenen Listeninhalt in die temporäre Datei.

type der Inhalt der Datei.

Problem mit oben: Formatierung. Es gibt nichts, um es wie ein Tisch oder so aussehen zu lassen. Abgesehen davon, dass Ihre Ordnernamen alle gleich lang sind ... Dann sind Sie eine gut sortierte Person!

Ich hoffe, das ist genug von einer Vorlage, um zu arbeiten und es Ihren engeren Wünschen anzupassen!

3

Dies ist meine Teillösung.

Wie Geisterfurz007 sagte, ist das Problem mit der Formatierung. Aber das fügt Dateien und Verzeichnisse nebeneinander zusammen. Vielleicht wird es Ihnen helfen, Fortschritte zu machen?

@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

Ja, ich habe nicht ' Beenden Sie das vollständige Programm. (Übung dem Leser überlassen). Die Absicht ist, DIR_COUNT und FILE_COUNT zu vergleichen, um herauszufinden, welcher größer ist, und das Verhalten entsprechend zu ändern. Aber das sollte ein guter Überblick darüber sein, wie man Dir und Dateien in zwei Spalten verschachtelt. – abelenky

0

Ich vermute, dass Sie mehr als eine Datei in Ihren Unterordnern haben.

Code:

@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 Verwendung ermöglicht es Ihnen, ohne das Hinzufügen von neuen Zeile nach der Zeichenfolge eine Zeichenfolge zu drucken.

Ich denke es gibt einfachere Methoden, an die ich nicht denken kann.

+0

Ich denke, es gibt keinen Grund, verzögerte Erweiterung zu aktivieren, weil ich keine Variable erweitert – SteveFest

0

Da die Frage formuliert ist, sollte diese einfache Linie tun:

dir /d|findstr /bvc:" " 

dir /d macht die Sache Tisch (kümmert sich sogar um Länge von Dateinamen), findstr /bvc:" " Header und Zusammenfassung entfernt.

nur für Ordner:

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

für Dateien nur:

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