Remove-Item cmdlet 简要概述
在计算中,管理文件和目录是一项常见任务,尤其是在 Windows PowerShell 环境中。PowerShell 中的 Remove-Item 是用于删除文件和目录(以及 PowerShell 中其他类型的项目)的关键 cmdlet。Remove-Item 既可用于本地文件系统,也可用于其他 PowerShell 提供程序,例如注册表(Registry)、证书存储区(Certificate Store)和环境变量。Remove-Item 还可以通过管道接收来自其他 cmdlet 的输入,从而实现更灵活的操作,并自动化文件管理任务。需要注意的是,默认情况下,使用 Remove-Item 删除的项目会从系统中永久移除,而不会被发送到回收站。在使用此 cmdlet 时,务必确认操作内容。
重要性与常见用例
PowerShell 中的 Remove-Item cmdlet 对于保持系统有序并确保其平稳运行非常重要。它对于有效的文件与目录管理至关重要,能够让用户清理不必要的文件并释放磁盘空间。在脚本编写和自动化中,它通过支持在无需人工干预的情况下删除过期文件或临时文件,从而帮助简化工作流程。PowerShell 的 Remove-Item cmdlet 也适用于常规维护任务,例如清理随时间累积的日志文件或临时文件夹。
常见使用场景
以下是使用 Remove-Item 命令的一些常见用例:
- 删除临时文件:定期移除临时文件以维持系统性能。
- 清理旧备份:自动删除旧备份文件以节省空间。
- 批量删除:移除具有特定扩展名的多个文件。
- 删除空目录:清理目录结构中的空文件夹。
- 清理注册表项:删除不再需要的特定注册表项。
- 部署脚本:在部署脚本中,在安装新应用之前先移除旧版本。
支持的提供程序和项目类型
Remove-Item PowerShell 命令支持多种提供程序和项目类型。它主要用于文件系统中删除文件和文件夹,但其功能不仅限于文件系统本身。它还可以删除注册表项和条目。这对于清理或修改系统配置非常有用。虽然不太常用于此目的,但 Remove-Item 也可以与其他 PowerShell 提供程序配合使用,从而删除变量、别名等项目。
基本语法
Remove-Item 的基本语法如下。
Remove-Item [-Path] <string[]> [-Force] [-Recurse] [-LiteralPath <string[]>] [-Confirm] [-WhatIf] [-ErrorAction <ActionPreference>] [-WarningAction <ActionPreference>] [-InformationAction <ActionPreference>] [-InformationVariable <string>] [<CommonParameters>]
下面是带有常用参数的 cmdlet 示例。
Remove-Item -Path C:\Backups\Design.txt -Force -Recurse -WhatIf
Remove-Item cmdlet 参数
以下是 Remove-Item cmdlet 中最常用的参数:
Parameters | Explanation |
|---|---|
|
-Path |
Specifies the path to the items that you want to remove. This parameter accepts wildcard characters, allowing for pattern matching. The path element can mean either absolute or relative. |
|
-LiteralPath |
Similar to -Path, but treats the path exactly as specified, without interpreting wildcards. |
|
-Force |
This is a remove item cmdlet that is used to force a command to remove items that cannot otherwise be deleted. For example, this can include hidden or read-only files or items with child items that are not empty. Use this parameter with caution, as it can result in data loss. |
|
-Include |
Specifies only the items that match the specified pattern or type of item to be removed. This works in conjunction with the -Path parameter to filter out items within the path. |
|
-Exclude |
Specifies items that should not be removed. This is used to exclude certain items from the operation based on the pattern provided. |
|
-Recurse |
If the item being removed is a directory, this parameter will ensure that all its child items are also removed. Without this parameter, the command will not delete directories that are not empty. |
|
-WhatIf |
This is a safety parameter that shows what would happen if the cmdlet ran, without performing the deletion. It is useful for verifying what will be deleted before committing to the action. |
|
-Confirm |
Prompts you for confirmation before executing the cmdlet. This can be a useful safety check to prevent accidental deletion of important items. |
|
-Credential |
Allows you to specify a user account with permission to perform the deletion, if necessary. |
|
-Stream |
This parameter is used to delete alternate data streams (ADS) from files and folders. |
如何使用文件资源管理器查找并复制完整路径
你可以在 Windows 中使用文件资源管理器(File Explorer)查找文件和文件夹的完整路径。当你需要在应用程序、脚本或 PowerShell cmdlet 中引用文件和文件夹时,这会很有用。按以下步骤查找文件和文件夹的路径。
- 打开文件资源管理器(File Explorer),导航到包含你要查找完整路径的文件或文件夹的文件夹。
- 进入所需文件夹后,点击文件资源管理器顶部的地址栏。这样会高亮显示完整路径。
- 右键单击已高亮显示的路径,然后从上下文菜单中选择“复制”,将完整路径复制到剪贴板。
- 如果需要某个特定文件的完整路径,请在地址栏的路径末尾输入包含扩展名的文件名以补全,例如“C:\Backup\Design.txt”。
通过 Remove-Item cmdlet 删除基础文件和文件夹
如何删除单个文件
要使用 PowerShell 通过 Remove-Item 删除单个文件,请按以下步骤操作。
- 打开 PowerShell,
- 输入 “Remove-Item” cmdlet,然后输入 “-Path” 参数以及要删除的文件的完整路径。
基本的 cmdlet 如下所示。
Remove-Item -Path "C:\Backup\Report.txt"
如何删除特定文件夹
要删除特定文件夹,请按以下 cmdlet 操作。
要删除位于“C:\Backups”中的名为“OldProjects”的文件夹,命令将如下所示。
Remove-Item -Path "C:\Backups\OldProjects"
删除多个文件和文件夹
如何删除文件夹及其所有内容
要删除文件夹及其所有内容,需要使用“ -Recurse”参数,以确保该文件夹连同其所有文件和子文件夹一起被删除。如果没有该参数,cmdlet 在文件夹包含文件或其他文件夹时将不会删除该文件夹。你可以使用下面的示例 cmdlet。
Remove-Item -Path "C:\Backups\OldDocuments" -Recurse
如何在目录中删除多个文件
如果要删除目录中某一特定类型的所有文件,可以在文件扩展名处使用通配符 (*)。例如,要删除特定文件夹中的所有“ .txt ”文件,可以使用下面的 cmdlet。
Remove-Item -Path "C:\Backups\OldDocuments\*.txt"
如何删除多种类型的文件
要删除目录中不同类型的文件,可以执行多个“Remove-Item”命令,或利用 PowerShell 接受“ -Path ”参数中的字符串数组的能力。不过,不支持在单个命令的“ -Path ”参数中直接组合多个通配符模式。您可以通过使用“Get-ChildItem”,并将其通过管道传递给 Remove-Item 来解决。比如,要删除目录中的“ .txt ”和“ .log ”文件,请使用下面的示例 cmdlet。
Get-ChildItem -Path "C:\Backups\OldDocuments\*.*" -Include *.txt, *.log | Remove-Item
如何删除指定的多个文件
要删除多个指定的文件,可以使用 PowerShell 的 delete file 命令,列出用逗号分隔的多个路径。
Remove-Item -Path "C:\Backups\OldDocuments\Design.txt", "C:\Backups\OldBackups\Backup_20_09_2024.bak"
如何使用通配符删除多个文件
要使用通配符来删除多个文件,可以在命令中使用星号(*)符号。星号充当通配符字符,可表示文件名中的任意字符数量,从而根据命名规则一次性定位多个文件。下面是一个示例。
你可以使用 PowerShell 删除以特定名称开头或包含特定模式的文件。例如,要删除所有以“Report”开头且与其文件扩展名无关的文件。
Remove-Item -Path "C:\Backups\OldDocuments\Report*"
包含特定文件类型并排除其他类型
-Include 和 -Exclude 参数在使用 PowerShell 的 Remove-Item cmdlet 来筛选要删除的文件和文件夹时非常有用。
- 包含参数
该参数允许您指定要在操作中包含的项目的匹配模式。它与 -Path 参数一起使用。
要删除文件夹中的所有 .txt 文件,同时排除所有其他文件,请使用下面的 cmdlet。
Remove-Item -Path "C:\Backup\*" -Include "*.txt"
- 排除参数
该参数允许您指定要从操作中排除的项目的匹配模式。
要删除文件夹中的所有文件,但排除 .txt 文件,请使用下面的 cmdlet。
Remove-Item -Path "C:\Backup\*" -Exclude "*.txt"
通过 Remote-Item 删除只读和隐藏文件
要删除只读和隐藏文件,需要使用 -Force 参数。该参数允许 cmdlet 覆盖通常会阻止删除项目的限制,例如只读或隐藏属性。你可以使用下面的示例 cmdlet。
如何删除单个文件
要删除单个文件,请使用以下 Remove-item cmdlet 语法
Remove-Item -Path "C:\Backups\Design.txt" -Force
如何使用通配符删除目录中的多个只读或隐藏文件
使用以下语法删除多个只读或隐藏文件:
Remove-Item -Path "C:\Backups\*.txt" -Force
您还可以先使用 Get-ChildItem cmdlet 获取特定目录中的所有只读文件和隐藏文件,然后使用带有 -Force 参数的 Remove-Item 将它们删除。下面是一些示例。
如何删除所有只读文件
使用以下语法删除所有只读文件。
Get-ChildItem -Path "C:\Backups" -File -Attributes ReadOnly | Remove-Item -Force
如何删除目录中的所有隐藏文件
使用以下语法删除所有隐藏文件:
Get-ChildItem -Path "C:\Backups" -File -Attributes Hidden | Remove-Item -Force
如何删除同时包含只读和隐藏属性的文件
Get-ChildItem -Path "C:\Backups" -File -Attributes ReadOnly,Hidden | Remove-Item -Force
使用 -Recurse 删除文件和子文件夹
要删除指定目录中的文件和子文件夹,你可以使用 -Recurse 参数。该参数会以递归方式移除该项以及其所有子项。 当你想清空某个目录及其全部内容(包括所有嵌套文件和子目录)时,这尤其有用。下面是一些示例。
删除目录中的所有文件和子文件夹
Remove-Item -Path "C:\Backups\*" -Recurse
如果某些项目是只读或隐藏的,你可以添加 -Force 参数。
Remove-Item -Path "C:\Backups\*" -Recurse -Force
删除包含特殊字符的文件
删除名称中包含特殊字符的文件有时会比较棘手,因为特殊字符可能会被 PowerShell 以不同方式解释,或者需要特殊处理。下面是一些示例。
为路径加引号
如果文件名包含空格或特殊字符(例如 (&, $, #, (), [])),请将路径用单引号括起来。这是确保 PowerShell 将整段字符串当作路径来处理的最简单方法。使用单引号可以确保 PowerShell 不会把 $ 展开为变量。
Remove-Item -Path 'C:\Backups\$Design(1).txt'
使用通配符匹配特殊字符
如果你在直接指定文件时遇到困难,或文件名包含许多特殊字符且较为复杂,你可以使用通配符 (*) 来匹配该文件,而无需输入完整名称。例如,如果你的文件名是“@#Name(1).txt”,那么你的 cmdlet 将如下所示。
Remove-Item -Path "C:\Backups\*Name*.txt"
删除备用数据流
备用数据流(ADS)允许文件包含不止一个数据流。此功能特定于 NTFS 文件系统,可用于在不影响文件主要内容的情况下,将其他信息存储在同一文件中;这可能被滥用于隐藏恶意数据。要从文件中移除备用数据流,你需要指定文件路径,并包含流名称。指定备用数据流的语法为“filename:streamname”。
如何识别备用数据流
你需要识别附加到文件上的备用数据流有哪些。为此,你可以使用下面的 cmdlet,并配合 -Stream 参数。
Get-Item -Path "C:\Backups\Design.txt" -Stream *
如何 移除备用数据流
一旦你知道要移除的流名称,就可以使用“Remove-Item”将其删除。假设文件“Design.txt”具有名为“hiddenstream”的备用数据流,并且你想将其移除。你可以使用下面包含 -Stream 参数的 cmdlet,它只会删除该数据流,而不会删除文件。
Remove-Item -Path “C:\Backups\Design.txt" -Stream hiddenstream
根据特定条件删除文件
根据特定条件删除文件有助于管理并自动化目录清理。条件可以基于多种文件属性,例如创建日期、修改日期、大小、名称模式等。下面是一些示例 cmdlet。
如何删除早于特定日期的文件
要删除早于特定日期的文件,可以使用“Get-ChildItem” cmdlet 列出目标目录中的所有文件,再用“Where-Object”根据其最后写入时间进行筛选,最后使用“Remove-Item”删除这些文件。
$DateLimit = (Get-Date).AddDays(-30)
Get-ChildItem -Path "C:\Backups\" -File | Where-Object { $_.LastWriteTime -lt $DateLimit } | Remove-Item
此命令会永久删除文件。建议先在不包含“| Remove-Item”的情况下运行命令,以查看将会删除哪些文件。
Get-ChildItem -Path "C:\Backups\" -File | Where-Object { $_.LastWriteTime -lt $DateLimit }
如何删除大于特定大小的文件
要删除大于特定大小的文件,可以使用 Get-ChildItem cmdlet,借助 “Where-Object” cmdlet 按大小筛选结果,然后使用 Remove-Item 将其删除。
$SizeLimit = 5MB
Get-ChildItem -Path "C:\Backups\" -File -Recurse | Where-Object { $_.Length -gt $SizeLimit } | Remove-Item
建议先在不使用 “| Remove-Item” 的情况下运行命令,以查看将会删除哪些文件。
Get-ChildItem -Path "C:\Backups\" -File -Recurse | Where-Object { $_.Length -gt $SizeLimit }
如何根据属性删除文件(只读、隐藏)
Get-ChildItem -Path "C:\Backups\" -File -Attributes Hidden | Remove-Item -Force
可以根据文件的属性(例如只读或隐藏),使用 Get-ChildItem 以及 Where-Object 按属性筛选文件,然后使用 Remove-Item 进行删除。需要注意的是,尝试删除只读文件会导致错误,除非你使用 -Force 参数。
Get-ChildItem -Path "C:\Backups\" -File | Where-Object { $_.Attributes -match "ReadOnly" } | Remove-Item -Force
您还可以在 Get-ChildItem 中使用 -Attributes 参数,并将值设置为“read only”,以直接筛选结果。
Get-ChildItem -Path "C:\Backups\" -File -Attributes ReadOnly | Remove-Item -Force
隐藏文件可以用类似的方法移除。
Get-ChildItem -Path "C:\Backups\" -File | Where-Object { $_.Attributes -match "Hidden" } | Remove-Item -Force
或者,您也可以通过指定 -Attributes 参数来删除。
如何删除目录中的所有空文件夹
可以使用 Get-ChildItem cmdlet 查找空文件夹,然后使用 Remove-Item 将它们删除。
Get-ChildItem -Path "C:\Backups\" -Directory -Recurse | Where-Object { $_.GetFileSystemInfos().Count -eq 0 } | Remove-Item -Force
要在实际移除之前查看哪些空文件夹会被删除,请将 Remove-Item -Force 替换为 Select-Object FullName。
Get-ChildItem -Path "C:\Backups\" -Directory -Recurse | Where-Object { $_.GetFileSystemInfos().Count -eq 0 } | Select-Object FullName
精心挑选的相关内容:
最佳实践与常见陷阱
Remove-Item PowerShell cmdlet 是一种强大的删除文件和目录的方法,但就像任何强大的工具一样,需要谨慎操作以避免意外后果。下面是在使用“删除文件”项路径时的一些最佳实践和常见陷阱。
使用 Remove-Item Cmdlet 的最佳实践
- 在执行可能会删除重要文件或目录的命令之前,请附加 -WhatIf 参数。这样会在不实际执行删除的情况下模拟该命令,让您查看哪些内容将受到影响。
- 为了增加一层保护,尤其是在运行会批量删除项目的脚本或命令时,请使用 -Confirm 参数。PowerShell 会提示您确认每一次删除,从而防止因误操作导致的数据丢失。
- 为避免删除错误的文件或目录,请指定要移除的项目的完整路径。这样有助于确保命令只会针对预期的项目。
- -Recurse 参数在删除目录及其内容时非常有用,但如果使用不当,也可能导致数据丢失。请务必先确认将要删除哪些项目:可以先使用 Get-ChildItem 进行列出,或在 Remove-Item 命令中使用 -WhatIf。
- 使用 -ErrorAction 指定 PowerShell 在删除过程中遇到错误时应如何处理。编写脚本时,可以考虑将 Remove-Item 命令放入 try/catch 块中,以更有效地管理异常。
- 在运行会影响大量文件或关键数据的删除命令之前,请确保已备份最新数据。
- 编写包含 Remove-Item 的脚本时,请对代码进行充分说明。解释为何要删除这些项目,以及你已采取的任何特定注意事项。
- 定期审查并审计执行删除操作的脚本和命令,以确保它们仍然满足当前需求,并遵循最佳实践。
- 在编写批量删除脚本时,先在非生产环境中进行测试,以避免意外的数据丢失。
常见的陷阱
- 通配符(*)虽然可以让你一次性定位多个文件或目录,但也可能增加删除非预期项目的风险。请谨慎使用,并始终检查将会受到影响的项目有哪些。
- 默认情况下,Remove-Item 不会删除只读和隐藏文件,除非你使用 -Force 参数。
- 如果权限不足,尝试删除文件或目录可能会导致错误。以管理员身份运行 PowerShell 可以解决其中一些问题。
- NTFS 文件系统支持诸如备用数据流(alternate data streams)之类的功能,这些功能在删除过程中可能会被忽略。请确保在你怀疑可能存在备用流的情况下包含 -Stream 参数。
使用 -WhatIf 和 -Confirm 进行安全删除
在使用 Remove-Item 来删除文件或目录时,-WhatIf 和 -Confirm 参数可以显著提升操作的安全性。这些参数有助于通过在执行前提供操作预览或在继续之前提示确认,从而防止意外删除。
-WhatIf
-WhatIf 参数会在不进行任何实际更改的情况下模拟命令的执行。
Remove-Item -Path "C:\Backups\Design.txt" -WhatIf
-Confirm
-Confirm 参数会在删除发生之前,提示你确认每一次删除。
Remove-Item -Path "C:\Backups\Design.txt" -Confirm
处理常见错误(Access Denied、File Not Found)
使用 Remove-Item cmdlet 时,可能会遇到诸如“Access Denied”或“File Not Found”这类常见错误。
Access Denied 错误
当你在 PowerShell 中没有删除文件或目录所需的权限时,就会出现此错误。
- 参数 -Force 有时可以通过允许删除只读文件来解决此错误,但它不会覆盖安全权限。
- 如果 -Force 无法生效,您可能需要手动调整文件或目录的权限。您可以通过 Windows 资源管理器中的文件或文件夹属性来更改权限,也可以使用 PowerShell cmdlet(例如 “Set-Acl”)。
- 以提升的权限运行 PowerShell 会话(以管理员身份运行)可以帮助绕过需要更高权限才能删除的文件的“Access Denied(拒绝访问)”错误。
文件未找到错误
如果 Remove-Item 中指定的路径不存在,就会发生此错误。
- 首先,请确认要删除的路径确实存在。拼写错误或不正确的路径指定是该错误的常见原因。
- 在尝试删除之前,请使用“Test-Path”检查文件或目录是否存在。这可以防止错误发生。
if (Test-Path "C:\Backups\Design.txt") {
Remove-Item -Path "C:\ Backups\Design.txt"
} else {
Write-Host "File not found."
}
- 你可以使用“ -ErrorAction SilentlyContinue”来抑制错误消息。在某些脚本中,缺少文件并不被视为关键失败,这时非常有用。
Remove-Item -Path "C:\ Backups\Design.txt" -ErrorAction SilentlyContinue
精选相关内容:
真实场景
清理临时文件
使用下面的 cmdlet 删除 “C:\Temp” 目录中的文件。
Get-ChildItem -Path C:\Temp\* -Recurse | Remove-Item -WhatIf
由于我们使用了 -WhatIf 参数,此 cmdlet 将按如下所示显示输出结果。移除 -WhatIf,然后再次运行该 cmdlet 以删除临时目录中的所有文件。
归档和删除旧日志
将超过 30 天的 “.log” 文件从一个位置移动到另一个位置,然后从归档中删除超过 90 天的日志。
$sourcePath = "C:\Backups"
$archivePath = "C:\ArchivedLogs"
Get-ChildItem -Path $sourcePath\*.log -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | ForEach-Object {
Move-Item -Path $_.FullName -Destination $archivePath -WhatIf
}
使用 “-WhatIf” 先检查要执行的操作,然后移除 “-WhatIf” 继续执行。
上面的脚本会将 “Backups” 文件夹中所有超过 30 天的文件移动到 “ArchivedLogs”。现在你可以通过运行下面的 cmdlet,删除 Archive 文件夹中已经超过 90 天的旧日志。
Get-ChildItem -Path $archivePath\*.log -Recurse | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | Remove-Item -WhatIf
确认目标,然后在不使用 “-WhatIf” 的情况下执行。
结论
Remove-Item cmdlet 用于删除一个或多个项,主要是文件和目录。不过,它的功能不仅限于文件和文件夹,还包括删除注册表项(registry keys)和变量等内容。Remove-Item 最关键的方面之一是安全性。如果不谨慎处理,删除文件和目录可能会产生不可逆的后果。Remove-Item 提供机制,使用 -WhatIf 和 -Confirm 参数来确保此类操作安全地执行。Remove-Item 可以集成到脚本中,用于自动化日常清理任务或更高效地管理文件系统;也可以定期删除临时文件,或清理不再需要的日志文件。支持使用通配符和过滤器,使其在需要基于特定模式或条件删除文件或文件夹的场景中尤其有用。
面向初学者的 Windows PowerShell 脚本教程(PDF)
了解更多常见问题(FAQ)
分享到
了解更多
关于作者
Kevin Horvatin
首席软件架构师
Kevin Horvatin 是 Netwrix 的首席软件架构师,负责 Netwrix Privilege Secure。作为一名拥有 20 多年经验的软件开发人员,自 PowerShell 和 C# 推出以来,他一直与它们合作开发。