当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell Remove-Item 删除文件

作者:精品下载站 日期:2024-12-14 03:44:26 浏览:17 分类:玩电脑

如何使用 PowerShell Remove-Item 删除文件


删除文件和清理目录可能是一项耗时的任务,尤其是当您需要定期在多台计算机上执行相同的任务时。但借助 PowerShell,我们可以创建小脚本,通过使用 Remove-Item cmdlet 快速高效地删除文件。

PowerShell 不仅允许我们删除单个文件,甚至可以根据特定条件删除整个目录或一组文件。您是否知道也可以仅删除存在的文件、早于 x 天的文件或基于通配符模式删除文件?

在本文中,我们将了解如何在 PowerShell 中删除文件。以及如何使用不同的选项仅删除特定文件、验证删除操作等等。

使用 PowerShell 删除文件

要使用 PowerShell 删除文件,我们需要使用 Remove-Item cmdlet。此 cmdlet 可以根据条件删除一项或多项。 Remove-Item cmdlet 不仅可用于删除文件,还可用于删除文件夹、注册表项、变量、函数等。我们将在本文中重点讨论删除文件。

通过Remove-Item cmdlet,我们可以使用以下参数:

-Path

指定需要删除的项目的路径。

-LiteralPath

项目的确切路径

-Include

指定要包含的路径元素,例如 *.txt

-Exclude

指定要排除的路径元素,例如 *.txt

-Recurse

删除指定位置和所有子文件夹中的项目

-Force

用于删除只读文件或隐藏项目

-Confirm

提示确认

因此,要使用 PowerShell 删除单个文件,我们只需指定文件的完整路径(包括文件名)。例如,如果我们想从下面的文件夹中删除 readme.txt 文件,我们可以这样做:

Remove-Item -Path C:\temp\files\readme.txt

请注意,该 cmdlet 不会要求确认,文件将立即被删除。因此,当您编写要删除一个或多个文件的 PowerShell 脚本时,首先对其进行测试非常重要。我们可以通过使用 -confirm-whatif 参数来做到这一点。如果您想删除该文件,Confirm 将给出提示,其中 if 显示 cmdlet 在不实际删除该项目的情况下将执行的操作:

# Using Confirm
Remove-Item -Path C:\temp\files\readme.txt -Confirm

Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\temp\files\readme.txt".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): 

# Or using WhatIf
Remove-Item -Path C:\temp\files\readme.txt -whatif
What if: Performing the operation "Remove File" on target "C:\temp\files\readme.txt".

[玩转系统] 如何使用 PowerShell Remove-Item 删除文件

删除文件夹中的所有文件

我们还可以使用 PowerShell 中的 Remove-Item cmdlet 来删除文件夹中的所有文件。现在需要注意的是,cmdlet 还可以删除文件夹。因此,要仅删除文件,我们将使用通配符来仅选择名称中包含点 . 的项目。这样,仅删除文件,而不删除任何子文件夹:

# Remove all files from the path c:\temp\files
# Tip: test the results first with the -whatif parameter
Remove-Item -Path C:\temp\files\*.*

另一种选择是使用带有参数 -File 的 cmdlet Get-ChildItem 来仅获取文件,然后通过管道将 Remove-Item cmdlet 传递给使用 PowerShell 删除文件:

Get-ChildItem -Path C:\temp\files\ -File | Remove-Item

删除文件夹和子文件夹中的文件

要不仅删除文件夹中的文件,还要删除子文件夹中的文件,您需要使用 -Recurse 参数。只有一个问题,你不能将 -Recurse 重组与仅文件选择方法 *.* 一起使用。以下面的例子为例:

Remove-Item -Path C:\temp\files\*.* -Recurse

您可能希望这只会删除文件夹和子文件夹中的文件。但是,通过在路径中使用通配符,只会选择路径名中包含 . 的项目(文件)。因此 cmdlet 不会遍历任何子文件夹。

要删除文件夹和所有子文件夹中的所有文件,我们必须仅指定父文件夹的路径,并使用 -Ininclude 参数仅选择文件:

# Delete all files from the folder c:\temp\files and it's subfolders
Remove-Item -Path C:\temp\files\ -Recurse -Include *.*

另一种选择是首先使用 Get-ChildItem cmdlet 从文件夹和子文件夹中获取文件,然后删除它们:

Get-ChildItem -Path C:\temp\files\ -File -Recurse | Remove-Item

删除只读和隐藏文件

默认情况下,只读文件和隐藏文件不会被删除。让我们看一下下面的例子,文件“la-srv-dc01.log”被标记为只读,而template.html是一个隐藏文件。

[玩转系统] 如何使用 PowerShell Remove-Item 删除文件

如果我们尝试删除该文件夹中的所有文件,那么您将在只读文件上收到错误消息,表明您没有足够的访问权限来执行此操作。隐藏文件甚至根本没有被删除。

那么我们该如何删除这些文件呢?要删除只读文件和隐藏文件,我们需要使用 -Force 参数:

# Remove all files, including read-only and hidden
Remove-Item -Path C:\temp\files\*.* -Force

PowerShell 删除文件(如果存在)

在脚本内使用 Remove-Item cmdlet 时,最好在尝试删除文件之前测试该文件是否存在。我们可以使用 Test-Path cmdlet 来完成此操作。这将检查文件是否存在并根据结果返回 true 或 false。通过在 if 语句中使用它,我们可以确保仅在文件存在时才删除该文件:

$file = C:\temp\files\readme.txt

if (Test-Path -Path $file) {
    Remove-Item -Path $file
}

在 PowerShell 中使用过滤器删除文件

我们现在已经了解了使用 PowerShell 删除文件的一些原则。但除了简单地删除单个文件或文件夹中的所有文件之外,您还会经常遇到只需要删除x天之前的文件或特定文件类型的文件的情况。

我们可以使用多种方法来仅选择这些文件并使用 PowerShell 删除它们。使用过滤器时,请务必确保在实际删除文件之前首先测试并验证选择。

使用包含过滤器

Include 参数允许我们选择文件名中包含特定字符串或字符串一部分的所有文件。例如,如果您只想从文件夹中删除 .log 文件,您可以执行以下操作:

# Remove all .log items
Remove-Item -Path C:\temp\files\ -Include *.log

include 参数不仅限于文件扩展名,您还可以根据文件名的一部分来选择文件。也可以指定多个要选择的“关键字”:

# Get all files that have the word app or process in their name.
Remove-Item -Path C:\temp\files\ -Include *app*, *process* -Recurse -WhatIf

# Result
What if: Performing the operation "Remove File" on target "C:\temp\files\subfolder\LT3452-process-errors.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\subfolder\LT3452-process.log".
What if: Performing the operation "Remove File" on target "C:\temp\files032021-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files032022-app.log".

使用排除过滤器

遵循include参数的原则,我们也可以排除文件。包含和排除可以一起使用,因此您可以删除除进程日志文件之外的所有日志文件:

Remove-Item -Path C:\temp\files\ -Include *.log -Exclude *process* -Recurse -WhatIf

# Result
What if: Performing the operation "Remove File" on target "C:\temp\files032021-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files032022-app.log".
What if: Performing the operation "Remove File" on target "C:\temp\files\la-srv-dc01.log".

使用 PowerShell 删除超过 x 天的文件

清理目录时的常见做法是仅删除早于 x 天的文件。为此,我们首先需要计算文件日期。假设我们要删除所有超过 30 天的文件,那么我们首先需要获取 30 天前的日期:

# Get the date from today minus 30 days
$dateTime = (Get-Date).AddDays(-30)

下一步是获取早于给定日期的所有文件。为此,我们将文件的 lastwritetime 与我们计算的 datetime 进行比较:

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime }

然后,我们只需在其后面传递 Remove-Item cmdlet 即可实际删除文件:

$dateTime = (Get-Date).AddDays(-30)
$path = "C:\temp\files\"

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime } | Remove-Item

删除大于的文件

要删除大于给定大小的所有文件,我们首先需要将文件大小从 Mb 转换为 kbits。有了正确的大小,我们就可以选择所有大于给定大小的文件,并使用 Remove-Item cmdlet 删除它们:

$path = "C:\temp\files\"

# Set file size
$sizeInMb = 500

# Calculate actual file size
$size = $sizeInMb*1024*1024

# Delete all files that are larger then given size
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.length -gt $size } | Remove-Item

总结

在自动管理和删除文件方面,PowerShell 是一个很棒的工具。您可以编写每周清理旧文件的脚本,以快速查找并删除给定文件夹中的大文件。

请记住,文件将被永久删除,因此请确保在实际删除文件之前先使用 参数测试命令。

我希望这篇文章对您有用,如果您有任何疑问,请在下面发表评论。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯