在 Powershell 中,如何使 zip 输出名称与输入名称相同
In Powershell, how to make the zip output name the same as the input name
我正在编写一个简单的 ps1 脚本来自动将日志文件压缩到各自的 zip 存档中(我最终将使用 Task Scheduler 来安排),我希望输出名称是与输入名称相同(例如 Log_20210309.log > Log_20210309.zip)
我觉得我很亲近。下面的示例查找文件名中包含昨天日期的 *.log 文件,我需要帮助的地方是将文件名通过管道传输到 zip 输出文件名。
$Input = "C:\Script\Input\"
$Output = "C:\Scripts\Output\"
Get-ChildItem $Input -Filter *$((Get-Date).AddDays(-1).ToString('yyyyMMdd')).log | Compress-Archive -DestinationPath $Output$_.FileName -Force
Get-ChildItem
部分似乎工作正常(如果我用 Compress-Archive -DestinationPath $Output -Force
替换管道后的所有内容,脚本会工作,但输出文件名将为空(“.zip”))。我已经尝试了数十种管道部分的变体,包括:
Compress-Archive -DestinationPath $Output + $_.FileName -Force
Compress-Archive -DestinationPath $Output + "$_.FileName" -Force
ForEach-Object { Compress-Archive -DestinationPath $Output"$_.FileName" -Force }
ForEach-Object { Compress-Archive -DestinationPath $Output + "$_.FileName" -Force }
等等...
在此示例中,我使用 *.txt
而不是 *.log
。这很好用:
$destinationPath="$PSScriptRoot\Output"
ls "$PSScriptRoot\input\*.txt"|%{
$fileName=$_.Name -replace '.txt','.zip'
Compress-Archive -Path $_.FullName -DestinationPath "$destinationPath$fileName" -CompressionLevel Optimal
}
此脚本使用源目录、目标目录和文件扩展名变量进行压缩。当它压缩正确的文件时,从 Compress-Archive
命令中删除 -WhatIf
。
$SourceDir = 'C:\Script\Input'
$OutputDir = 'C:\Script\Output'
$Extension = '.log'
Get-ChildItem -File -Recurse -Path $SourceDir -Filter $('*' + $Extension) |
ForEach-Object {
Compress-Archive `
-DestinationPath (Join-Path $OutputDir $($_.BaseName + '.zip')) `
-Path $_.FullName -WhatIf
}
我正在编写一个简单的 ps1 脚本来自动将日志文件压缩到各自的 zip 存档中(我最终将使用 Task Scheduler 来安排),我希望输出名称是与输入名称相同(例如 Log_20210309.log > Log_20210309.zip)
我觉得我很亲近。下面的示例查找文件名中包含昨天日期的 *.log 文件,我需要帮助的地方是将文件名通过管道传输到 zip 输出文件名。
$Input = "C:\Script\Input\"
$Output = "C:\Scripts\Output\"
Get-ChildItem $Input -Filter *$((Get-Date).AddDays(-1).ToString('yyyyMMdd')).log | Compress-Archive -DestinationPath $Output$_.FileName -Force
Get-ChildItem
部分似乎工作正常(如果我用 Compress-Archive -DestinationPath $Output -Force
替换管道后的所有内容,脚本会工作,但输出文件名将为空(“.zip”))。我已经尝试了数十种管道部分的变体,包括:
Compress-Archive -DestinationPath $Output + $_.FileName -Force
Compress-Archive -DestinationPath $Output + "$_.FileName" -Force
ForEach-Object { Compress-Archive -DestinationPath $Output"$_.FileName" -Force }
ForEach-Object { Compress-Archive -DestinationPath $Output + "$_.FileName" -Force }
等等...
在此示例中,我使用 *.txt
而不是 *.log
。这很好用:
$destinationPath="$PSScriptRoot\Output"
ls "$PSScriptRoot\input\*.txt"|%{
$fileName=$_.Name -replace '.txt','.zip'
Compress-Archive -Path $_.FullName -DestinationPath "$destinationPath$fileName" -CompressionLevel Optimal
}
此脚本使用源目录、目标目录和文件扩展名变量进行压缩。当它压缩正确的文件时,从 Compress-Archive
命令中删除 -WhatIf
。
$SourceDir = 'C:\Script\Input'
$OutputDir = 'C:\Script\Output'
$Extension = '.log'
Get-ChildItem -File -Recurse -Path $SourceDir -Filter $('*' + $Extension) |
ForEach-Object {
Compress-Archive `
-DestinationPath (Join-Path $OutputDir $($_.BaseName + '.zip')) `
-Path $_.FullName -WhatIf
}