2016-07-07 3 views
1

У меня есть огромное количество файлов (> 30K), которые все хранятся в одном каталоге и нуждаются в реорганизации и архивировании.Пакет или Powershell: Архивные файлы с похожими именами

Файлы именуются как (не хронологического порядка):

  • M056811-01-.txt
  • M056811-02-.txt
  • M056811-03-.txt
  • M956782 -01-.txt
  • M956782-02-.txt ...

Я хочу архивировать файлы, которые принадлежат друг другу (имеют один и тот же префикс) в один zip-файл. Что бы привести к своего рода:

  • M056811.zip
  • M956782.zip ...

Есть ли способ для того чтобы достигнуть этого с некоторыми Batch или Powershell сценариев.

Я не очень продвинутый в сценариях. За исключением самого ответа (если есть решение), мне очень хотелось бы знать, что это работает.

Мое окончательное решение (большое спасибо David Брабанта):

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

$dirpath = "<Enter Directorypath here>" 
$offsetlength = 6 

$pathlength = $dirpath.Length 
$absolutelength = $pathlength + $offsetlength 


dir $dirpath | group { $_.FullName.Substring(0, $absolutelength) } | %{ 
    $subset = $_ 

    $subset.Group | %{ 
     Compress-Archive $_ $subset.Name -Update 
    } 
} 
+0

SO не является бесплатным кодовым письмом! Попробуйте сами, и когда вы застряли, вернитесь сюда, опишите точно, чего вы хотите достичь и что делает ваш код на самом деле. – aschipfl

ответ

1

Вот то, что вы можете начать с в PowerShell (ех for /?, set /?.) , Предполагается, что вы используете PowerShell 5 (для командлета Compress-Archive).

$dirpath = "D:\temp" 

dir $dirpath | group { $_.Name.Substring(0, 8) } | %{ 
    $subset = $_ 

    $subset.Group | %{ 
     Compress-Archive $_ $subset.Name -Update 
    } 
} 
+0

Привет, Дэвид, спасибо за ваш ответ. Я предполагаю, что Name.Substring (0, 8) группирует имя по первым 8 символам? PS отвечает следующим: какая идея может быть причиной? Не существующий путь M63251-25-.txt: строка. В H: \ tools \ powershell \ Group_and_Archive.ps1: 7 char: 9 + Compress-Archive $ _ $ subset.Name -Update + ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: InvalidArgument: (M63251-25-.txt: String) [Compress-Archive], InvalidOperationException + FullyQualifiedErrorId: ArchiveCmdletPathNotFound, Compress-Archive –

+0

Нашел ошибку. Сценарий должен находиться в том же каталоге, что и файлы. Теперь он работает !!! Спасибо Дэвиду. Можете ли вы рассказать мне, как установить конкретный каталог. Таким образом, нет необходимости, чтобы сценарий находился в одном и том же каталоге? Большое спасибо Дэвиду! –

0

вы можете работать с подстановочными знаками. Для «любого символа» есть ? и * для «одного или нескольких символов». Это называется «файловой маской», например M000001-??-.txt.

dir "M000001-??-.txt" 
dir "M000001*.txt" 
dir "M000001*.*" 

Ваш почтовый-приложение, скорее всего, также поддерживает файловые маски, так что вы можете сделать что-то вроде (синтаксис во многом зависит от того, какое приложение использовать - обратитесь к документации):

ZipApp.exe /zip "M000001-??-.txt" "M000001.zip" 

Ну, это было легкая часть. Теперь обработать все ваши файлы. У вас есть общие префиксы (M000xxx), что позволяет использовать простой счетчик (for /L), добавить достаточное количество ведущих нулей, взять последние 6 символов и, наконец, добавить еще один «М» перед ним. При этом вы можете легко создать свою файловую маску и имя своего zip-файла.

@echo off 
setlocal enabledelayedexpansion 
for /l %%i in (1,1,10) do (
    set "n=0000000%%i" 
    set "n=M!n:~-6!" 
    echo Mask="!n!-??-.txt" Zipfile="!n!.zip" 
) 

Вам нужно delayed expansion обрабатывать переменные внутри цикла for.

Вместо строки echo запустите приложение zip с правильным синтаксисом параметров.(Не могу помочь вам в этом - смотрите это документация)

Если вы не уверены в команде, видеть, что это поможет с command /?

+0

Благодарим за отзыв. Извините, но я не упомянул об этом в своем первоначальном вопросе. Имена не являются хронологическим порядком. Больше похоже на M065788-01-.txt, M065788-02-.txt .... M0255288-01-.txt, M0255288-02-.txt. Спасибо за ваши усилия. –

Смежные вопросы