2016-02-11 7 views
0

Я использую команду 7zip для сжатия файлов журнала, которые старше 30 дней, но не работают для меня. Вот код:Использование команды 7zip, но неспособной использовать ее для цикла

$Pathname="G:\7za920\test" 

$folders = (Get-ChildItem -Path $pathname | Where-Object {$_.Attributes -eq "Directory"} | Select Fullname).Fullname 
#looping all folders 
Foreach ($folder in $folders) 
{ 

    $files = Get-ChildItem -Path "$folder" | Where{$_.LastWriteTime -lt (Get-Date).AddDays(-30)} 

Foreach ($file in $files) 
{ 

    ./7za.exe a -tzip archive.zip $file 

} 

} 

Пожалуйста, помогите мне

+2

Что именно вы подразумеваете под 'но не работающим'? Нет сжатых файлов? Неверные файлы сжаты? Неверное имя архива? Что-то еще, что? – vonPryz

+0

Эй, спасибо за ответ. Таким образом, это не сжатие файлов. Архив создается, НО внутри этого, все его пусто :( – CodeX

ответ

0

Проблема вызывается пропусканием System.IO.FileSystemInfo.FileInfo объект 7z.exe. Программа сжатия ожидает имя файла (ов), а не объект автоматизации Powershell. 7Zip не знает, что делать с объектом FileInfo, поэтому его вызов будет использовать только его метод .ToString(), который возвращает только имя файла. Это не полезно, если вы находитесь в другом каталоге, поэтому команда не работает.

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

PS C:> & 'C: \ Program Files \ 7-Zip \ 7z.exe' а -tzip с : \ Temp \ archive.zip $ файл

7-Zip [64] 9,20 Copyright (с) 1999-2010 Игорь Павлов 2010-11-18
Сканирование UpgradeLog2.htm: ВНИМАНИЕ: система не может найти файл
указано. Создание архива c: \ temp \ archive.zip ПРЕДУПРЕЖДЕНИЯ для файлов:
UpgradeLog2.htm: система не может найти указанный файл.
--------------- ПРЕДУПРЕЖДЕНИЕ: Не удается найти один файл

Исправление достаточно просто, так как FileInfo class содержит полное имя файла. Используйте его как параметр, и 7Zip получит полный путь для источника.

./7za.exe a -tzip archive.zip $file.FullName 
+0

Эй, спасибо за это исправление! У меня есть еще один вопрос: прямо сейчас концепция - все папки архивируются в zip-файл с именем archive.zip. Что делать, если я хочу, чтобы каждый файл чтобы быть заархивированным отдельно, а не под общим архивом. например У меня есть 3 файла, a.log, b.log, c.log, и теперь после запуска скрипта я должен получить a.zip, b.zip и c. zip, а также 3 файла журнала должны быть удалены? Какие изменения должны быть внесены в скрипт? – CodeX