【问题标题】:PowerShell to delete files not matching an array of user namesPowerShell删除与用户名数组不匹配的文件
【发布时间】:2018-03-26 14:22:17
【问题描述】:

我有一个简单的数据库查询,它返回一组当前用户 例如 ABB016
ACQ002
AGU003
AHM007

我想删除特定文件夹中的所有文件,这些文件的名称位于文件结尾 (BaseName) 左侧,但在此数组中找不到。

下面的代码是我目前拥有的,但是目前它会删除该目录中的所有文件

# Find files that do not have the same basename as current users' name and delete
Get-ChildItem -path $DirectoryWithFiles -rec *.* | Where-Object {
      $SQLQeryResultsSet -NotContains $_.BaseName } | 
   Remove-Item -WhatIf

如果:对目标“ABB016.pdf”执行“删除文件”操作。

如果:对目标“ACQ002.pdf”执行“删除文件”操作。

如果:对目标“AGU003.pdf”执行“删除文件”操作。

我做错了什么?

【问题讨论】:

  • 也许验证 $SQLQeryResultsSet 实际上包含预期的字符串值。即检查$SQLQeryResultsSet[0] 是预期的第一个用户名,$SQLQeryResultsSet[0].GetType() 返回String
  • 感谢@Mathias $SQLQeryResultsSet[0] -> ABB016 和 $SQLQeryResultsSet[0].GetType() -> DataRow。

标签: arrays powershell


【解决方案1】:

正如您的 cmets 所建议的,$SQLQeryResultsSet 不是字符串数组,而是DataTable

您可以像这样从每个数据行的第一列中提取单个字符串值:

$ExcludedUsers = $SQLQeryResultsSet |ForEach-Object { '{0}' -f $_.Item(0) }

然后在Where-Object 过滤器脚本块中使用这个新变量代替$SQLQeryResultsSet

【讨论】:

  • 感谢@Mathias 完美运行 - 现在按预期工作并排除当前用户 $ExcludedUsers[0].GetType() IsPublic IsSerial Name BaseType -------- ------ -- ---- -------- True True String System.Object
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2022-10-15
  • 2021-06-20
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多