Как сжать несколько файлов в один почтовый индекс с PowerShell? - PullRequest
7 голосов
/ 12 апреля 2011

Я хочу сжать несколько файлов в один zip.

Я застрял с этим на данный момент:

Get-ChildItem -path C:\logs -Recurse | Where {$_.Extension -eq ".csv" -and $_.LastWriteTime -lt (Get-Date).AddDays(-7)} | write-zip -level 9 -append ($_.LastWriteTime).zip | move-item -Force -Destination {
    $dir = "C:\backup\archive"
    $null = mkdir $dir -Force
    "$dir\"
}

Я получаю это исключение

Write-Zip: Невозможно привязать аргумент к параметру «Путь», поскольку он равен нулю.

Эта часть проблемы:

write-zip -level 9 -append ($_.LastWriteTime).zip

Я никогда раньше не использовал powershell, но мне нужно предоставить скрипт, я не могу предоставить решение на c #.

1 Ответ

9 голосов
/ 12 апреля 2011

Проблема в том, что Get-ChildItem возвращает экземпляры класса System.IO.FileInfo , который не имеет свойства с именем Path.Поэтому значение не может быть автоматически сопоставлено с параметром Path командлета Write-Zip через трубопровод.

Вам придется использовать ForEach-Object Командлет для архивирования файлов с использованием свойства System.IO.FileInfo.FullName , которое содержит полный путь:

Get-ChildItem -Path C:\Logs | Where-Object { $_.Extension -eq ".txt" } | ForEach-Object { Write-Zip -Path $_.FullName -OutputPath "$_.zip" }

Ниже приведена более короткая версия команды с использованием aliases и позиционные параметры:

dir C:\Logs | where { $_.Extension -eq ".txt" } | foreach { Write-Zip $_.FullName "$_.zip" }

Связанные ресурсы:

...