行为不一致:GCI / -Include

时间:2017-07-31 20:09:18

标签: powershell

我正在开发一个自动清理脚本,它使用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是否存在已知问题?当以具有管理员权限的用户帐户运行时,此操作可正常运行。

1 个答案:

答案 0 :(得分:0)

我发现我的脚本问题是我将xml放入变量的方法。我使用的Get-Content没有保留任何格式或类型信息,而不是Import-CliXml。这导致Get-ChildItem -Include参数作为单个字符串而不是字符串数组输入(因为它们在xml中以逗号分隔)。

我对此的解决方法是创建一个具有已定义类型的对象(例如预期的字符串数组(String[]),而不是担心创建/导出/导入xml文件。

$global:Config = @{
  OS = @{
    Workstation = @{
      Folders = @( @{ Name=..;Include=..;Expiration=..;Threshold=..;} );
    };
  };
};