Ошибка «Неизвестного переключения» при использовании 7-zip в скрипте PowerShell для архивирования имен файлов, начинающихся с `-`

#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" $_ }