2017-01-17 5 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

Да, t закончить полную программу. (Упражнение у читателя). Цель состоит в том, чтобы сравнить DIR_COUNT и FILE_COUNT, чтобы выяснить, какой из них больше, и изменить поведение соответствующим образом. Но это должен быть достойный план того, как чередовать Dirs и Files в двух столбцах. – 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 делает таблицу вещь (даже заботится о длине имен файлов), findstr /bvc:" " удаляет заголовок и резюме.

только для папок:

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

только для файлов:

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