【问题标题】:Recursive Wildcards in PowerShellPowerShell 中的递归通配符
【发布时间】:2018-10-16 13:59:55
【问题描述】:

我正在尝试使用 PowerShell 删除一组特定文件夹中的文件。我的代码目前如下所示:

$tempfolders = @(
    "C:\Windows\Temp\*"
    "C:\Documents and Settings\*\Local Settings\temp\*"
    "C:\Users\*\Appdata\Local\Temp\*"
    )

Remove-Item $tempfolders -Recurse -Force -ErrorAction SilentlyContinue

我想使用以下公式向该列表添加一个新文件夹:

"C:\users\*\AppData\Local\Program\**\Subfolder"

其中** 可能是多个未知长度的子文件夹。例如,它可以是settings\subsettings 或folder\settings\subsettings。有没有办法做到这一点?

【问题讨论】:

  • 您可能必须使用Get-ChildItem 来获取主文件夹的内容,然后过滤符合您的条件的内容,然后删除这些结果

标签: powershell wildcard


【解决方案1】:

您可以将每个文件的完整路径提供给正则表达式;这将仅返回与您的格式匹配的文件,然后您可以将其通过管道传递给 Remove-Item:

ls "C:\Users" -Recurse -Hidden | Where-Object { $_.FullName -imatch '^C:\\users\\([^\\]+)\\AppData\\Local\\Program\\(.*)\\Subfolder' }

因为正则表达式被认为是只写的,稍微解释一下:

  • 反斜杠算作正则表达式中的转义字符,需要加倍。
  • ([^\\]+) 表示除反斜杠以外的任意字符中的一个或多个
  • .* 表示零个或多个任意字符

【讨论】:

  • 由于某种原因这不起作用,即使我知道它应该这样做。它没有找到文件。我把它放到一个在线的正则表达式测试器中,它应该可以找到文件,但是当我把它放到 PowerShell 命令中时它什么也没有返回。
  • 想通了。我必须将 ls 指向一个起点,以便它在文件系统的正确区域运行,并包含 -hidden 标志,因为 appdata 文件夹是隐藏的。 (虽然,这极大地增加了脚本的运行时间。)我相应地编辑了答案
【解决方案2】:

您可以使用Get-ChildItem -Directory -Recurse, 这将完全满足您的要求。将其从数组通过管道传输到 Remove-Item

@("C:\Windows\Temp\*", "C:\Documents and Settings\*\Local Settings\temp\*", "C:\Users\*\Appdata\Local\Temp\*") | 
    Get-ChildItem -Directory -Recurse -Force -ErrorAction SilentlyContinue | 
    Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

在 Powershell 管道中提醒一下 | 是关键。 PowerShell 我们喜欢链接命令。

【讨论】:

  • 这实际上是我的代码,稍作修改,甚至没有尝试回答手头的问题。
猜你喜欢
  • 2018-10-19
  • 2011-01-29
  • 2015-11-04
  • 2019-01-19
  • 2021-06-25
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多