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

[玩转系统] 如何使用 PowerShell 移动文件

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

如何使用 PowerShell 移动文件


当您需要移动大量文件或移动多台计算机上的特定文件时,PowerShell 是一个很好的工具。使用 PowerShell,我们可以快速编写一个脚本来移动文件,甚至在需要时添加一些日志记录。

移动文件是一项非常常见的任务,例如,您可能希望将所有超过 x 天的文件存档到不同的位置。通过利用 PowerShell,我们可以编写脚本并安排其自动运行。

在本文中,我将解释如何使用 PowerShell 移动文件并提供一些示例。

使用 PowerShell 移动文件

使用 PowerShell 移动单个文件是通过 Move-Item cmdlet 完成的。它需要源文件的路径和移动文件的目标。以下示例将 readme.txt 文件移动到 d:\archive 文件夹:

Move-Item -Path "C:\temp\files\readme.txt" -Destination "D:\archive\"

需要注意的是,目标文件夹需要以 \ 结尾。这样做的原因是,如果目标文件夹(本例中的 archive)不存在,则 PowerShell 会将文件移动到 D:\ 并为其命名存档,没有任何文件扩展名。

如果您想在控制台中查看哪些文件被复制,则可以使用 -PassThru 参数。这将输出一个包含所有移动文件的对象。

移动文件夹中的所有文件

您可以使用通配符* 移动文件夹中的所有文件。如果您只想移动文件而不移动任何子文件夹,请在路径参数中使用 *.*

# Move only all the files
Move-Item -Path "C:\temp\files\*.*" -Destination "D:\archive\"

要移动所有子文件夹及其内容,您只需使用 * 作为通配符:

# move all files and subfodlers
Move-Item -Path "C:\temp\files\*" -Destination "D:\archive\"

移动特定文件

有时您只想移动特定文件。您可以通过使用通配符并指定要移动的文件的文件扩展名来完成此操作。例如,要从文件夹中移动所有 .csv 文件,我们可以使用以下命令:

Move-Item -Path "C:\temp\files\*.csv" -Destination "D:\archive\"

[玩转系统] 如何使用 PowerShell 移动文件

在上面的示例中,仅将给定文件夹中的 CSV 文件移动到目标。如果您还想从子文件夹中移动文件 CSV 文件,那么我们首先需要使用 Get-ChildItem cmdlet 获取所有项目。

Get-ChildItem cmdlet 将从给定路径获取所有项目。通过使用 -Recurse 参数,它还将获取子文件夹中的所有项目。然后,我们可以通过管道将 Move-Item cmdlet 传递给它,以将选定的文件移动到新的目标:

Get-ChildItem -Path "C:\temp\files\*.csv" -Recurse | Move-Item -Destination "D:\archive\"

[玩转系统] 如何使用 PowerShell 移动文件

使用包含和排除参数

Move-Item cmdlet 有一个您可以使用的 -Include-Exclude 参数。它们允许您指定要移动或不移动到目标的文件类型。

Move-Item -Path "c:\temp\files\*" -Include "*.txt","*.csv" -Destination "d:\archive\"

现在,如果您尝试在 PowerShell 5.x 中使用这些参数,那么您可能会注意到它会在所有与包含不匹配的项目上抛出错误,“...不存在”或排除参数。

该问题已在 PowerShell 7 中得到解决,但如果您使用的是 PowerShell 5.x,则可以先使用 Get-ChildItem cmdlet 解决此问题。另一个选项是指定包含要移动的所有文件类型的多个路径:

Move-Item -Path "c:\temp\files\*.csv", "c:\temp\files\*.txt" -Destination "d:\archive\"

强制覆盖文件

当您尝试移动目标文件夹中已存在的文件时,您将收到文件存在的错误消息。要覆盖现有文件,只需使用 -Force 参数即可。

高级移动文件示例

您现在应该对 move-item cmdlet 的基础知识有了很好的了解。让我们看一些更高级的示例。

移动超过 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 }

然后,我们只需在其后面传递 Move-Item cmdlet 即可将文件实际移动到新位置

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

# Move all files from the given path and subfolders that are older than 30 days
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $dateTime } | Move-Item -Destination "D:\archive\"

移动大于的文件

另一个常见操作是仅移动给定文件夹中的大文件。就像仅移动旧文件一样,我们首先使用 Get-ChildItem cmdlet 获取项目。

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

# Set file size
$sizeInMb = 500

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

# Move all files that are larger then given size
Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.length -gt $size } | Move-Item -Destination "D:\archive\"

总结

使用 Move-Item cmdlet 移动文件非常简单。如果您只想选择特定文件或想要使用高级文件,则可以使用 Get-ChildItem cmdlet 来选择所需的文件。

如果您想创建已移动文件的日志文件,请确保您也阅读了本文。此外,您还可以在本文中阅读有关调度脚本的更多信息。

我希望您喜欢这篇文章,请务必订阅时事通讯或在 Facebook 上关注我以获取最新文章。如果您有任何疑问,请在下面发表评论。

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

取消回复欢迎 发表评论:

关灯