2011-04-12 23 views
7

Quiero comprimir varios archivos en un zip.¿Cómo comprimir varios archivos en un zip con PowerShell?

estoy atascado con este piso en la actualidad

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\" 
} 

me sale esta excepción

Write-Zip: No se puede enlazar argumento al parámetro 'Camino', ya que es nulo.

Esta parte es el problema:

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

nunca he utilizado PowerShell antes, pero tengo que proporcionar un guión, no puede proporcionar una solución C#.

Respuesta

9

El problema es que Get-ChildItem devuelve instancias de la clase System.IO.FileInfo, que no tiene una propiedad denominada Path. Por lo tanto, el valor no se puede asignar automáticamente al parámetro Path del cmdlet Write-Zip a través de la tubería.

Vas a tener que usar el cmdlet ForEach-Object para comprimir los archivos utilizando la propiedad System.IO.FileInfo.FullName, que contiene la ruta completa:

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

Aquí hay una versión más corta del comando usando aliases y parámetros posicionales:

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

relacionados:

+0

Si quieres que sea aún más corto que puede mover el filtro en la llamada 'Get-ChildItem' así:' dir c: \ Logs * .txt | foreach {Write-Zip $ _. FullName "$ _. zip"} ' –

Cuestiones relacionadas