PowerShell中的递归通配符

PowerShell中的递归通配符,powershell,wildcard,Powershell,Wildcard,我正在尝试使用PowerShell删除特定文件夹集中的文件。我的代码当前如下所示: $tempfolders = @( "C:\Windows\Temp\*" "C:\Documents and Settings\*\Local Settings\temp\*" "C:\Users\*\Appdata\Local\Temp\*" ) Remove-Item $tempfolders -Recurse -Force -ErrorAction SilentlyCon

我正在尝试使用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
, 这将完全满足您的要求。通过管道将其从阵列传输到
删除项

@("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我们喜欢链接命令。

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

ls "C:\Users" -Recurse -Hidden | Where-Object { $_.FullName -imatch '^C:\\users\\([^\\]+)\\AppData\\Local\\Program\\(.*)\\Subfolder' }
因为正则表达式被认为是只写的,所以需要解释一下:

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

您可能需要使用
Get ChildItem
来获取主文件夹的内容,然后过滤符合条件的内容,然后删除这些结果这是我的代码,只需稍加编辑,甚至不尝试回答手头的问题。出于某种原因,这不起作用,尽管我知道应该这样做。它找不到文件。我把它放到一个在线的正则表达式测试程序中,它应该可以找到文件,但是当我把它放到PowerShell命令中时,它什么也不返回。我明白了。我必须将ls指向一个起始点,以便它在文件系统的正确区域中运行,并且由于appdata文件夹是隐藏的,所以必须包含-hidden标志。(尽管这大大增加了脚本的运行时间)我相应地编辑了答案