#powershell #7zip
#powershell #7zip
Вопрос:
У меня есть ряд файлов в папке, которые содержат большие файлы журналов
-20180907 1229 debug.log -20180907 1229 system.log
Я хочу написать скрипт PowerShell для архивирования их с уменьшением размера. Вот мой скрипт:
dir *.log | % {
$archive = '"' $_.Name '.7z"'
$archive
$source = '"' $_.Name '"'
$source
amp;"C:Program Files7-Zip7z.exe" -mx9 a -t7z $archive $source -WhatIf
}
Однако, когда я запускаю его, я получаю следующий вывод:
"-20180907 1229 debug.log.7z" "-20180907 1229 debug.log" 7z.exe : В C:UsersUserTemporaryTest 7zarchive-logs.ps1:6 char:5 amp;"C:Program Files7-Zip7z.exe " -mx9 a -t7z $archive $source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: не указано: (:строка) [], RemoteException FullyQualifiedErrorId: NativeCommandError Ошибка командной строки: Неизвестный переключатель: -20180907 1229 debug.log.7z "-20180907 1229 system.log.7z" "-20180907 1229 system.log" 7z.exe : В C:UsersUserTemporaryTest 7zarchive-logs.ps1:6 char:5 amp;"C:Program Files7-Zip7z.exe " -mx9 a -t7z $archive $source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: не указано: (:строка) [], RemoteException FullyQualifiedErrorId: NativeCommandError Ошибка командной строки: Неизвестный переключатель: -20180907 1229 system.log.7z
Несмотря на то, что я заключаю имя файла в двойные кавычки, оно отображается так, что 7-Zip игнорирует двойные кавычки.
Есть идеи?
Я попробовал этот вариант (заключая имена файлов в одинарные кавычки):
dir *.log | % {
$archive = "'" $_.Name ".7z'"
$archive
$source = "'" $_.Name "'"
$source
amp;"C:Program Files7-Zip7z.exe" -mx9 a -t7z $archive $source
}
И на этот раз я получил этот вывод:
'-20180907 1229 debug.log.7z' '-20180907 1229 debug.log' 7-Zip 18.05 (x64): Авторское право (c) 1999-2018 Игорь Павлов : 2018-04-30 Откройте архив: '-20180907 1229 debug.log.7z' -- Path = '-20180907 1229 debug.log.7z' Тип = 7z Физический размер = 32 Размер заголовков = 0 Solid = - Блоки = 0 Сканирование диска: 7z.exe : В C:UsersUserTemporaryTest 7zarchive-logs-B.ps1:6 char:5 amp;"C:Program Files7-Zip7z.exe " -mx9 a -t7z $archive $source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CategoryInfo: не указано: (:строка) [], RemoteException FullyQualifiedErrorId: NativeCommandError ПРЕДУПРЕЖДЕНИЕ: система не может найти указанный файл. '-20180907 1229 debug.log' 0 файлов, 0 байт Обновление архива: '-20180907 1229 debug.log.7z' Добавление новых данных в архив: 0 файлов, 0 байт Файлов, прочитанных с диска: 0 Размер архива: 32 байта (1 КБ) ПРЕДУПРЕЖДЕНИЯ о ПРОВЕРКЕ файлов и папок: '-20180907 1229 отладка.журнал': система не может найти указанный файл. ---------------- ПРЕДУПРЕЖДЕНИЯ при сканировании: 1
Создаются файлы, подобные '-20180907 1229 debug.log.7z'
, но без содержимого.
Комментарии:
1. Заключите это в одинарные кавычки, чтобы не активировать оператор.
2. @Drew — Я пробовал это, и это тоже не сработало. Я опубликую код и выходные данные.
3. Какой у вас рабочий каталог? Это то же самое, что и файлы .log?
4. @Fourat — Да, это так.
Ответ №1:
Попробуйте это:
$executable = "C:Program Files7-Zip7z.exe"
dir *.log | % {
$archive = "$($_.Name).7z"
$archive
$source = $_.Name
$source
$oneliner = "a",".$($archive)",".$($source)", "-mx4"
amp; $executable @oneliner
}
Комментарии:
1. Добавьте больше объяснений, чтобы пользователь, который задал вопрос, мог понять ваш ответ.
2. Было бы неплохо дать объяснение, особенно касающееся синтаксиса
$onliner
значения.3. Для
$onliner
я использовал метод, называемый splatting . Больше информации о запуске исполняемых файлов в Powershell здесь .
Ответ №2:
Я думаю, что это не обязательно заключать в кавычки.
Что, если я сделаю следующее?
dir *.log | % { amp;"C:Program Files7-Zip7z.exe" -mx9 a -t7z "$_.7z" $_ }