我正在开发一个自动清理脚本,它使用Get-ChildItem
非常自由。我使用-Include
标志从XML配置中过滤内容以进行清理,因为它需要一个字符串数组而-Filter
没有。这是有争议的问题:
Function CleanFolders
{
Write-Log 'Cleaning Folders..' status
ForEach ($Folder in $Config.OS.$Build.Folders.Folder)
{
If (Test-Path $Folder.Name)
{
Try {
GCI $Folder.Name -Include $Folder.Include -Recurse -Force |
Where { ($_.Length -gt ([Int]$Folder.Threshold * 1MB)) -and
($_.LastWriteTime -lt (Get-Date).AddDays(-[Int]$Folder.Expiration)) } |
Sort $_.IsPSContainer -Descending |
% {
Try {
Write-Log "Deleting $($_.FullName)"
Remove-Item "$($_.FullName)" -Force
} Catch {
Write-Log 'Unable to delete item' error
Write-Log "[$($_.Exception.GetType().FullName)] - $($_.Exception.Message)" error
}
}
} Catch { Write-Log "[$($_.Exception.GetType().FullName)] - $($_.Exception.Message)" error }
} Else { Write-Log "$($Folder.Name) does not exist" error }
}
}
脚本作为SYSTEM从计划任务运行,并且由于某种原因,不会返回-Include
标志中不仅仅是通配符*
的结果。 -Include
是否存在已知问题?当以具有管理员权限的用户帐户运行时,此操作可正常运行。
答案 0 :(得分:0)
我发现我的脚本问题是我将xml放入变量的方法。我使用的Get-Content
没有保留任何格式或类型信息,而不是Import-CliXml
。这导致Get-ChildItem -Include
参数作为单个字符串而不是字符串数组输入(因为它们在xml中以逗号分隔)。
我对此的解决方法是创建一个具有已定义类型的对象(例如预期的字符串数组(String[]
),而不是担心创建/导出/导入xml文件。
$global:Config = @{
OS = @{
Workstation = @{
Folders = @( @{ Name=..;Include=..;Expiration=..;Threshold=..;} );
};
};
};