Создать подпапки на основе типов файлов в подпапке и переместить все из этого типа - PullRequest
0 голосов
/ 11 июля 2019

У меня в папке «Мои документы» есть папка «Разное», и в этой папке находится 400 подпапок, что стало беспорядком.В каждой из этих подпапок находятся разные типы файлов, я хотел бы иметь возможность создавать подпапки в каждой подпапке на основе типа файла и перемещать все файлы этого типа в новую подпапку.

Так что я бы хотелхотелось бы иметь что-то вроде этого:

C:\Users\Personal\Documents\Misc\
 - Subfolder1
  - PDF
  - PNG
  - PDF
- Subfolder2
  - XLSX
  - DOCX
  - PDF
- Subfolder3
  - M4A
  - MKV
  - PNG

Нет согласованности с тем, какие типы файлов находятся в каждой подпапке, где у меня возникают проблемы.Это вообще возможно сделать?

До сих пор я заходил в каждую папку и запускал следующий командный файл

for %%a in (.) do md "%%~na PNG" &move "*.png" ".\%%~na PNG\"
for %%a in (.) do md "%%~na Documents" &move "*.docx" ".\%%~na Documents\"
for %%a in (.) do md "%%~na PDF" &move "*.pdf" ".\%%~na PDF\"
for %%a in (.) do md "%%~na Spreadsheets" &move "*.xlsx" ".\%%~na Spreadsheets\"

Каждый раз, когда я сталкиваюсь с новым расширением файлаЯ добавляю новую строку.Но в идеале я хотел бы, чтобы папки создавались только в том случае, если расширение файла находится в папке, и мне не нужно было бы вручную заходить в каждую папку, чтобы запустить его.

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Ваши for циклы не обращаются к файловой системе, потому что нет подстановочных знаков , поэтому они повторяются только один раз и возвращают . в свою мета-переменную %%a .

В любом случае, не уверен, правильно ли я понял, что вы хотите, но попробуйте следующий код:

@echo off
rem // Iterate through all immediate sub-directories of the target root directory:
for /D %%D in ("%UserProfile%\Documents\Misc\*") do (
    rem // Iterate through all files in each sub-directory:
    for %%F in ("%%~D\*.*") do (
        rem /* Remove the leading `.` from the name extension of the current file;
        rem    if the files has got no extension, this loop does not iterate: */
        for /F "tokens=* delims=." %%E in ("%%~xF") do (
            rem /* Create sub-directory from file name extension;
            rem    suppress errors if it already exists from previous iteration: */
            md "%%~D\%%E" 2> nul
            rem // Actually move the current file into the sub-directory:
            move /Y "%%~F" "%%~D\%%E"
        )
    )
)
0 голосов
/ 11 июля 2019

Поскольку использование тегов было ограничено только , и вы уже приняли ответ , я обновил теги, которые вы использовали, ивключил этот пример, основанный на ваших заявленных требованиях:

$ds=GCI "C:\Users\Personal\Documents\Misc"|?{$_.PSIsContainer}|Select -Exp FullName
ForEach($f In $ds){
    $gs=GCI $f|?{(!($_.PSIsContainer))}|Group Extension
    ForEach($g In $gs){
        $n=Join-Path $f($g.Name.Substring(1,($g.Name.Length-1)))
        If(-Not(Test-Path $n)){[Void](MD $n)}
        $g.Group|Move -Dest $n
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...