Я ищу помощь с пакетными файлами, которые позволят мне переместить все файлы определенного типа (*.PDF, например) в новую папку. ОДНАКО я хотел бы иметь особенности, не столь очевидные для меня. (Я не программист) включен в процесс (см. Вопросы в конце моего сообщения). Я исчерпывающе искал в Интернете решение и не нашел приложение, которое делает то, что мне нужно. Итак, я пришел сюда в поисках разработанных решений. Я обнаружил, что могу использовать ROBOCOPY, чтобы получить все свои файлы в каталоге, используя:

@echo off
set source="R:\Users\Public\"
set destination="R:\Users\Public\All_PDF_Files\"
ROBOCOPY %source% %destination% *.pdf /S /R:1 /W:1 /NDL /XD OutputFolderfor /r %source in (*) do @copy "%destination" .

Но что я не могу определить, как это сделать, так это сгладить каталог и собрать все файлы в одну папку. Я видел один или два поста (один от пользователя Макса, который написал командный файл, чтобы сгладить каталог, и это почти то, что мне нужно. Итак, начиная с его пакетных файлов .... Предполагая, что у меня есть дерево каталогов, содержащее только каталоги и подкаталоги, содержащие файлы PDF ... и определенную папку назначения ...Макс представил следующее ...

С Максом ниже ...

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

C:\ files\ somefiles\ file.txt C:\ files\ otherfiles\ file.txt местом назначения является C:\ newdir\ файлы создаются как C:\ newdir\ somefiles-file.txt C:\ newdir\ otherfiles-file. Здесь приведен код, командный файл 1 проходит через файлы, командный файл 2 переименовывает и перемещает их (также можно скопировать вместо этого, если вы хотите сохранить исходный код:

@echo off
for /r %%f in (*.*pr) do @renameandmovefilespart2.bat "%%f" "%%~ff" "%%~xf"

renameandmovefilespart2.bat

@echo off
Setlocal EnableDelayedExpansion
rem set the whole file path
set origWhole=%1
set origPathOnly=%2
set extension=%3
rem here you can set where the directory to hold the flattened hierarchy is
set destDir=c:\destinationDir\
rem  set the directory to do a string replace
rem make this the starting directory, that you dont want in the newly renamed files
set startingDir=C:\starting\directory\
set nothing=
set slash=\
rem here you can set what the character to represent the directory indicator \ in the new files 
set reaplcementDirectoryCharacter=--
set quote="
rem cut out the starting part of the directory
call set newname=%%origWhole:!startingDir!=!nothing!%%
rem replace slashes with new character
call set newname=%%newname:!slash!=!reaplcementDirectoryCharacter!%%
rem remove quotes
call set newname=%%newname:!quote!=!nothing!%%
rem @echo shortened: %newname%
rem @echo source path: %origPathOnly% newPath: %startingDir%
rem @echo extension: %extension%
rem rename the files
ren %origWhole% %newname%
rem prepare to move the file, clean up the source path
call set origPathOnly=%%origPathOnly:!quote!=!nothing!%%
move "%origPathOnly%%newname%" "%destDir%"

Вопросы:

1.) вместо того, чтобы предварительно добавлять имя файла к исходной папке, как я могу добавить имя файла к месту расположения исходного файла? Должен ли я просто переписать "%% ~ ff" "%% ~ xf" в "%% FF ~" "%% XF ~"

2.) Я не хочу, чтобы файлы перемещались. Я хотел бы просто перезаписать исходный файл. Примечание. Я могу удалить исходный файл, если это необходимо!

Еще вопрос?

3.) Что (*. * Pr) делает в первом пакетном файле Макса?

4.) Что Макс понимает под этими (Строка 9) rem делает этот стартовый каталог, который вам не нужен во вновь переименованных файлах (строка 10) «rem делает этот стартовый каталог, который вам не нужен во вновь переименованных файлах» в пакете 2 выше? Он просто указывает на подкаталог в исходном каталоге?

1 ответ1

0

Если вы не ограничены пакетными файлами, вот решение PowerShell:

# Setup source and destination paths
$Src = 'c:\source'
$Dst = 'c:\destination'

# Wildcard for filter
$Extension = '*.pdf'

# Get file objects recursively
Get-ChildItem -Path $Src -Filter $Extension -Recurse |
    # Skip directories, because XXX.PDF is a valid directory name
    Where-Object {!$_.PsIsContainer} |
        # For each file
        ForEach-Object {

            # If file exist in destination folder, rename it with directory tag
            if(Test-Path -Path (Join-Path -Path $Dst -ChildPath $_.Name))
            {
                # Get full path to the file without drive letter and replace `\` with '-'
                # [regex]::Escape is needed because -replace uses regex, so we should escape '\'
                $NameWithDirTag = (Split-Path -Path $_.FullName -NoQualifier)  -replace [regex]::Escape('\'), '-'

                # Join new file name with destination directory
                $NewPath = Join-Path -Path $Dst -ChildPath $NameWithDirTag
            }
            # Don't modify new file path, if file doesn't exist in target dir
            else
            {
                $NewPath = $Dst
            }

            # Copy file
            Copy-Item -Path $_.FullName -Destination $NewPath
        }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .