PowerShell 中的递归通配符

Recursive Wildcards in PowerShell

我正在尝试使用 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 -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。

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

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

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

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