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

У меня есть ряд файлов в папке, которые содержат большие файлы журнала

-20180907 1229 debug.log
-20180907 1229 system.log

Я хочу написать сценарий PowerShell для архивирования их по размеру. Вот мой сценарий:

dir *.log | % {
    $archive = '"' + $_.Name + '.7z"'
    $archive
    $source = '"' + $_.Name + '"'
    $source
    &"C:\Program Files\7-Zip\7z.exe" -mx9 a -t7z $archive $source -WhatIf
}

Когда я запускаю его, я получаю следующий вывод:

"-20180907 1229 debug.log.7z"
"-20180907 1229 debug.log"
7z.exe : 
At C:\Users\User\Temporary\Test 7z\archive-logs.ps1:6 char:5
+     &"C:\Program Files\7-Zip\7z.exe" -mx9 a -t7z $archive $source
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Command Line Error:
Unknown switch:
-20180907 1229 debug.log.7z
"-20180907 1229 system.log.7z"
"-20180907 1229 system.log"
7z.exe : 
At C:\Users\User\Temporary\Test 7z\archive-logs.ps1:6 char:5
+     &"C:\Program Files\7-Zip\7z.exe" -mx9 a -t7z $archive $source
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Command Line Error:
Unknown switch:
-20180907 1229 system.log.7z

Несмотря на то, что я заключаю имя файла в двойные кавычки, оно выглядит так, как 7-Zip игнорирует двойные кавычки.

Есть идеи?


Я пробовал этот вариант (заключая имена файлов в одинарные кавычки):

dir *.log | % {
    $archive = "'" + $_.Name + ".7z'"
    $archive
    $source = "'" + $_.Name + "'"
    $source
    &"C:\Program Files\7-Zip\7z.exe" -mx9 a -t7z $archive $source
}

И на этот раз я получил такой вывод:

'-20180907 1229 debug.log.7z'
'-20180907 1229 debug.log'

7-Zip 18.05 (x64) : Copyright (c) 1999-2018 Igor Pavlov : 2018-04-30

Open archive: '-20180907 1229 debug.log.7z'
--
Path = '-20180907 1229 debug.log.7z'
Type = 7z
Physical Size = 32
Headers Size = 0
Solid = -
Blocks = 0

Scanning the drive:
7z.exe : 
At C:\Users\User\Temporary\Test 7z\archive-logs-B.ps1:6 char:5
+     &"C:\Program Files\7-Zip\7z.exe" -mx9 a -t7z $archive $source
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

WARNING: The system cannot find the file specified.
'-20180907 1229 debug.log'
0 files, 0 bytes

Updating archive: '-20180907 1229 debug.log.7z'

Add new data to archive: 0 files, 0 bytes


Files read from disk: 0
Archive size: 32 bytes (1 KiB)

Scan WARNINGS for files and folders:

'-20180907 1229 debug.log' : The system cannot find the file specified.
----------------
Scan WARNINGS: 1

Он создает файлы типа '-20180907 1229 debug.log.7z', но без содержимого.

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Попробуйте это:

 $executable = "C:\Program Files\7-Zip\7z.exe"

 dir *.log | % {
    $archive = "$($_.Name).7z"
    $archive
    $source = $_.Name
    $source 
    $oneliner = "a",".\$($archive)",".\$($source)", "-mx4"
    & $executable @oneliner
}
0 голосов
/ 01 апреля 2019

Я думаю, его не нужно заключать в кавычки.
Что если я сделаю следующее?

dir *.log | % { &"C:\Program Files\7-Zip\7z.exe" -mx9 a -t7z "$_.7z" $_ }
...