我正在尝试存档服务器中的旧文件(早于90天),它应该是每个月的单独ZIP文件。我有powershell-v1.0因此我无法使用System.Management.Automation.PSObject
我创建了一个脚本但是我的zip文件名有问题。当我运行脚本时,所有文件都移动到一个名为+++
的存档。
$folders ="C:\New folder\test\"
Function Zip
{
Param
(
[string]$zipFile
,
[string[]]$toBeZipped
)
$CurDir = Get-Location
Set-Location "C:\program files\7-zip\"
.\7z.exe A -tzip $zipFile $toBeZipped | Out-Null
Set-Location $CurDir
}
$files = Get-ChildItem -Path $folders | Where-Object {$_.LastwriteTime -lt ((Get-date).adddays(-90))} | % { $_.FullName};
if ( !$files)
{break}
else
{
Write-Host $files
$file_year = $files.LastwriteTime.Year
$file_month = $files.LastwriteTime.Month
echo $file_month
ZIP $folders+"$file_year"+"$file_month"+".zip" $files
If(Test-Path $folders+$file_year+$file_month+.zip)
{
Remove-Item $files
}}
如果有人能弄清楚我做错了什么,那就太好了。
答案 0 :(得分:1)
有两个问题,为什么这不起作用。首先,您选择(使用ForEach-Object
cmdlet %
)FullName
属性,因此无法再访问LastWriteTime
属性。其次,您试图访问可能的文件数组(您想要使用哪个年份和月份?)
因此,我会将您的脚本更改/重构为此类内容(未经测试)。
$folders ="C:\New folder\test\"
function Write-ZipFile
{
Param
(
[string]$Path,
[string[]]$Files
)
$7zip = Join-Path $env:ProgramFiles '\7-zip\7z.exe'
& $7zip A -tzip $zipFile $toBeZipped | Out-Null
}
$files = Get-ChildItem -Path $folders |
Where-Object { $_.LastWriteTime -lt ((Get-date).AddDays(-90)) }
$zipFile = Join-Path $folders ('{0}{1}.zip' -f $files[0].LastwriteTime.Year, $files[0].LastwriteTime.Month)
Write-ZipFile -Path $zipFile -Files ($files | select -ExpandProperty FullName)
答案 1 :(得分:1)
要归档的文件名列表在$ files中。使用$files.GetType()
查看它是一个数组。使用$files[0].GetType()
可以看到每个元素都是字符串类型,而不是文件对象类型。
$ files = Get-ChildItem -Path $ folders | Where-Object {$ _。LastwriteTime -lt(Get-date).adddays(-90)}
我想你会想要省略目录。
$ files数组将是FileInfo对象的数组,而不是字符串。
其次,做一些事情来迭代FileInfo对象列表。
[cmdletbinding()]
Param()
$folders = "H:\src\powershell\afm"
Function Zip
{
Param (
[string]$zipFile
, [string[]]$toBeZipped
)
& "C:\Program Files\7-Zip\7z.exe" A -tzip $zipFile $toBeZipped | Out-Null
}
$files = Get-ChildItem -Path $folders -File |
Where-Object {($_.LastwriteTime -lt (Get-date).adddays(-10)) -and ($_.Extension -ne ".zip")}
$files | ForEach-Object {
Write-Verbose "Working on file $_"
$file_year = $_.LastwriteTime.Year
$file_month = $_.LastwriteTime.Month
Write-Verbose "file_month is $file_month"
Zip "$folders\$file_year$file_month.zip" "$folders\$_"
If (Test-Path "$folders\$file_year$file_month.zip")
{
### Remove-Item $_q
}
}
问题似乎是没有什么可以处理每个文件来存档它们。没有ForEach-Object。
数组对象上没有LastWriteTime,仅在FileInfo对象上。