Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

使用 PowerShell Move-Item Cmdlet 移动文件

使用 PowerShell Move-Item Cmdlet 移动文件

Aug 25, 2025

The Move-Item cmdlet 让你能够在 PowerShell 中精确地移动文件、文件夹、注册表项和子项。你可以移动单个或多个文件,在移动过程中重命名它们,保留或展开文件夹结构,并可在本地或网络路径之间进行操作。常用参数包括 -Recurse, -Include, -Exclude, -Filter, -Force, and -WhatIf。为确保安全,请将移动与 Test-Path、错误处理(try/catch)以及日志记录结合使用。

作为日常任务,用户会将文件和文件夹等项目从计算机上的一个位置移动到另一个位置,以便对数据进行整理并让其更有意义。虽然可以通过在文件资源管理器中使用简单的 copy and paste 选项来完成此操作,但高级用户可能更倾向于使用 PowerShell,以获得更高的效率和精确性。

定义:Move-Item Cmdlet

PowerShell 中的 Move-Item cmdlet 会在文件资源管理器中将某个项目从一个位置移动到另一个位置,并保持其属性、内容和子项不变。可按如下方式使用:

  • 将文件或文件夹从一个目录移动到另一个目录
  • 一次移动多个文件或目录
  • 将注册表子项从一个键移动到另一个键

一旦添加到新位置,被移动的项目将从其原始位置中移除。

作为先决条件,新位置必须由同一提供程序(provider)支持。

Move-Item 的基本语法

Move-Item cmdlet 具有以下基本语法:

      Move-Item -Path "sourceFilePath" -Destination "destinationFilePath"
      

下面是包含支持参数的语法示例:

      Move-Item
    [-Path] <String[]>
    [[-Destination] <String>]
    [-Force]
    [-Filter <String>]
    [-Include <String[]>]
    [-Exclude <String[]>]
    [-PassThru]
    [-Credential <PSCredential>]
    [-WhatIf]
    [-Confirm]
    [<CommonParameters>]
      

使用 Move-Item 移动单个文件

要通过 PowerShell 将单个文件从一个位置移动到另一个位置,请在 Move-Item cmdlet 中指定源文件路径和目标目录。如下:

      Move-Item -Path <source file path>\<file name> -Destination <Destination path>
      

移动 过程中,您也可以重命名该文件。

场景 1 – 移动单个文件且不重命名

此 cmdlet 会将 Test.txt 文件从 C:\Temp 目录移动到 C:\Backup 目录,而不会重命名该文件:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup
      

情景 2 – 移动单个文件,并在移动过程中对其重命名

此 cmdlet 会将 Test.txt 文件从 C:\Temp 目录移动到 C:\Backup 目录,并在移动的同时将其重命名为 UseCase.txt

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\UseCase.txt
      
Image

移动多个文件

你可以在 Move-Item cmdlet 中使用通配符,一次移动多个项目(例如多个文件),从一个位置到另一个位置。例如,你可以轻松地将同一扩展名的所有文件从一个位置移动到另一个位置。

方案 1 – 使用通配符移动所有相同扩展名的文件

此 cmdlet 会将所有文本文件(*.txt)从 C:\Temp 目录移动到 C:\Backup 目录,并保留所有其他文件:

      Move-Item -Path C:\Temp\*.txt -Destination C:\Backup
      

方案 2 – 不区分扩展名移动所有文件

使用带有 -File 参数的 Get-ChildItem cmdlet,从源目录中筛选出所有文件(不包括文件夹)。然后将结果通过管道传给 Move-Item cmdlet,将筛选出的文件移动到目标目录,同时保留所有文件夹。

在下面的 cmdlet 中,-File 参数只会筛选 C:\Temp 目录中的文件。然后,Move-Item cmdlet 会将这些文件从 C:\Temp 移动到 C:\Backup 目录,同时保留 C:\Temp 中的文件夹:

      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

情景 3 – 移动特定文件

同样也可以移动具有相同或不同扩展名的特定文件。此时,需要通过提供路径数组并用逗号分隔多个值来指定多个文件。

此 cmdlet 会将两个名为 Test.txtUseCase.pdf 的文件C:\Temp 文件夹中的内容C:\Backup 文件夹:

      Move-Item -Path C:\Temp\test.txt, C:\Temp\UseCase.pdf -Destination C:\Backup
      

移动目录

PowerShell 的 Move-Item cmdlet 足够强大,可以将包含所有内容(文件、文件夹、子文件夹)的目录移动到另一个目录。或者,你也可以选择移动全部内容,并在原位置留下空目录。无论哪种情况,源位置的文件夹结构都会复制到目标位置。

场景 1 – 将整个目录及其所有内容一起移动

此 cmdlet 会将 Temp 文件夹(及其内容)移动到 C:\Backup 文件夹。

      Move-Item -Path C:\Temp -Destination C:\Backup
      

请注意:Temp 文件夹将从 C:\ 删除,并放置到 Backup 目录中。

场景 2 – 将目录中的所有内容移走,同时保留该目录本身

此 cmdlet 会递归地将 Keys 目录中的所有文件和文件夹移动到 C:\Backup 文件夹。

      Move-Item -Path C:\Temp\Keys\* -Destination C:\Backup
      

请注意,在此情况下,源目录(Keys)会保留在原地,而其所有内容都会被移动。此 cmdlet 应使源目录保持为空。

将文件移动到网络位置

Move-Item cmdlet 也可以将文件移动到网络位置。只需将网络路径作为目标即可。

请考虑以下情况:

  • 你必须具备访问该网络位置所需的权限。
  • 必须能够从运行该 cmdlet 的计算机访问网络路径。
  • 如果网络位置需要身份验证,则必须执行以下操作之一:
  • 先使用 New-PSDrive cmdlet 映射网络驱动器,或通过 Windows 资源管理器手动映射
  • 访问网络资源时指定凭据

方案 1 – 将文件移动到网络位置

此 cmdlet 会将 Text.txt 文件从 C:\Temp 移动到网络位置:该位置是服务器 Backup 上名为 FileServer 的文件夹。

      Move-Item -Path C:\Temp\test.txt -Destination \\FileServer\Backup
      

场景 2 – 移动文件时防止覆盖

使用 Move-Item cmdlet 将文件移动到网络位置时,如果文件名相同,PowerShell 会覆盖现有文件,即使未提供 -Force 参数。

为防止覆盖,请在移动文件之前添加检查。

      if (-not (Test-Path "\\FileServer\Backup\test.txt")) {
    Move-Item -Path "C:\Temp\test.txt" -Destination "\\FileServer\Backup"
}
else {
    Write-Host "A file with the same name already exists in the destination."
}
      

Test-Path 会检查目标位置中是否已存在该文件。如果存在,则不会移动该文件 ad 而是改为通知你。

面向初学者的 Windows PowerShell 脚本编写教程(PDF)

了解更多

递归移动文件

PowerShell 的 Move-Item cmdlet 也可以配合 -Recurse 参数使用,将指定目录中的所有文件(包括其中所有文件夹及其子文件夹)移动到另一个位置。你还可以将移动操作限制为仅移动具有特定扩展名的文件。

方案 1:递归移动所有相同扩展名的文件

此 cmdlet 会递归地将所有 PDF 文件从 C:\Temp 目录及其子文件夹移动到 C:\Backup 目录。

      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

在这里,Get-ChildItem cmdlet 会获取 C:\Temp 目录及其子文件夹中扩展名为 *.pdf 的子项。它使用 -Recurse 参数来使检索变为递归方式。

管道符号(|)会将结果发送到 Move-Item cmdlet,后者会把 pdf 文件移动到 Backup 目录。

注意: 默认情况下,Get-ChildItem 不会移动隐藏文件。要移动隐藏文件,请在 Get-ChildItem 中使用 -Force 参数,然后将结果通过管道传给 Move-Item。

方案 2 – 递归移动所有文件

在 Get-ChildItem cmdlet 中使用 -Recurse 参数,可以递归地将文件从一个目录移动到另一个目录。

此 cmdlet 会将 C:\Temp 目录及其所有子目录中的全部文件移动到 C:\Backup 目录。-Recurse 参数用于搜索指定路径下的所有子目录,而 -File 参数会将 cmdlet 限制为仅检索文件(不包含文件夹)。

      Get-ChildItem -Path C:\Temp -Recurse -File | Move-Item -Destination C:\Backup
      

请注意,此 cmdlet 只会移动文件,不会影响任何文件夹或子文件夹。此外,该 cmdlet 会将文件移动到目标目录的根目录,而不会在目标位置创建源目录的文件夹结构。

筛选文件

使用 Move-Item cmdlet 在移动项目的同时,可以根据特定条件对项目进行筛选。例如,你可能希望在源目录中保留某个特定文件,或移动具有特定名称或扩展名的文件。-Filter、-Include 和 -Exclude 参数非常适用于这类操作。

  • -Include 参数用于在移动时包含与特定属性匹配的文件。例如,你可以将文件名(c:\temp\test*)或扩展名(*.txt)作为属性指定,这样只有与给定属性匹配的文件才会被移动到目标位置。
  • -Exclude 参数用于从移动操作中排除与特定属性匹配的文件。 例如,你可以将文件名(c:\temp\test*)或扩展名(*.txt)指定为属性,这样与所给属性匹配的文件将不会被移动到目标位置。
  • -Filter 参数类似于 -Include 参数,但其速度更快、效率也比 -Include 更高。

请考虑以下内容:

  • 要包含、排除或筛选特定数据,必须使用整个文件夹内容。
  • 这些参数可以与通配符一起使用。

注意
在运行下方场景中提供的 cmdlet 之前,请确认您正在使用最新的 PowerShell 版本。否则,请更新 PowerShell 版本以确保操作顺畅。

场景 1 – 排除特定扩展名的文件

此 cmdlet 会将来自 C:\Temp 文件夹中的所有文件移动到 Backup 文件夹,但不包括扩展名为 .txt 的文件。

      Move-Item -Path C:\Temp\* -Exclude *.txt -Destination C:\Backup
      

同样,在下面的 cmdlet 中,-Filter 参数将把来自 C:\Temp 的所有 .docx 文件移动到 C:\Backup

      Move-Item -Path C:\Temp\* -Filter *.docx -Destination C:\Backup
      

场景 2 – 移动特定扩展名的文件

此 cmdlet 只会将 C:\Temp 文件夹中的文本文件(.txt)移动到 Backup 文件夹。

      Move-Item -Path C:\Temp\* -Include *.txt -Destination C:\Backup
      

有关类似功能,请参阅“移动多个文件”部分。

方案 3 – 移动名称以特定字符串开头的文件

此 cmdlet 会移动名称以“log”开头的文件。它不会将不以“log”开头的文件从 C:\Temp 移走。

      Move-Item -Path C:\Temp\* -Include log* -Destination C:\Backup
      

高级移动方案

Move-Item PowerShell cmdlet 还可以根据特定条件移动文件,例如文件大小、修改日期等。为此,你可以选择以下任意一种方法:

  • 使用 -Filter 参数
  • 在移动文件之前,使用 Get-ChildItem 和 Where-Object 选择具有特定属性或日期属性的文件。其过程包括三个步骤:
  • Get-ChildItem cmdlet 会从源位置检索文件。
  • 要按属性(例如文件大小或最后修改日期)进行筛选,请将输出通过管道传递给 Where-Object cmdlet。
  • 接下来将输出通过管道传递给 Move-Item cmdlet,以移动已筛选的文件。

因此,要移动大于 5 GB 的文件,您可以使用 Get-ChildItem 查找文件,然后用 Where-Object 进行筛选,最后用 Move-Item 进行移动。

场景 1 – 移动最近 X 天内修改过的文件和文件夹

此 cmdlet 会将最近 30 天内修改过的所有文件和文件夹,从 C:\Temp 目录移动到 C:\RecentFiles 目录。

      Get-ChildItem -Path C:\Temp\* | Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(-30)} | Move-Item -Destination C:\RecentFiles
      

尽管你现在肯定已经很熟悉 Get-ChildItem 和 Move-Item cmdlet,让我们继续深入了解 Where-Object。此 cmdlet 会筛选最近 30 天内修改过的项。

  • $_ 表示从 Get-ChildItem 传入的每个对象(文件或文件夹)。
  • LastWriteTime 是文件/目录的一个属性,用于显示该项最后一次被修改或写入的时间。
  • (Get-Date).AddDays(-30) 会获取当前日期,并从中减去 30 天。

方案 2 – 移动大于特定大小的文件和文件夹

此 cmdlet 会将所有大于 2GB 的文件和文件夹从 C:\Temp 目录移动到 C:\LargeFiles 目录。

      Get-ChildItem -Path C:\Temp\* | Where-Object {$_.Length -gt 2GB} | Move-Item -Destination C:\LargeFiles
      

保留文件夹结构

Move-Item cmdlet 并不会自动将源位置到目标路径之间的整个文件夹结构复制或重新创建。不过,在将文件移动到目标位置时,有一些方法可以保留文件夹结构:

  • 将 Move-Item cmdlet 与其他 cmdlet 结合使用,例如在验证后使用 Copy-Item 和 Remove-Item
  • 手动重新创建文件夹结构

方案 1 – 在保留内容和文件夹结构完整的情况下移动目录

如需在保持所有内容及文件夹结构完整的情况下移动目录,请参阅“Move a Directory”部分。

情景 2 — 在保留文件夹结构的同时移动特定文件

PowerShell 支持更复杂的功能:您可以在目的地重新创建文件夹结构的同时移动特定文件。

      This script moves specific files (e.g., .pdf files) while keeping the folder structure intact:
Get-ChildItem -Path "C:\Temp" -Recurse -Filter "*.pdf" | ForEach-Object {
    $destinationPath = $_.FullName.Replace("C:\Temp", "C:\Backup")
    $destinationDir = Split-Path $destinationPath
    if (-not (Test-Path $destinationDir)) {
        New-Item -ItemType Directory -Path $destinationDir
    }
    Move-Item -Path $_.FullName -Destination $destinationPath
}
      
Maintain Folder Structure with Move-Iteam Cmdlet

在这里,Get-ChildItem -Recurse 会获取源目录中的所有 .pdf 文件(包括子文件夹)。ForEach-Object 会遍历找到的每个文件。

Replace(“C:\Temp”, “C:\Backup”) 会调整源路径,以在目的地创建对应的路径;并且 New-Item -ItemType Directory 会在目的地目录不存在时创建文件夹结构。

处理覆盖(Overwrite)

有时可能需要覆盖现有文件。为此,请在 PowerShell 的 Move-Item cmdlet 中使用 -Force 参数。

场景 1 – 覆盖目标位置的文件

此 cmdlet 会将 test.txt 文件从 C:\Temp 文件夹移动到 C:\Backup 文件夹,同时覆盖目标位置中同名可能已存在的任何文件。

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      
Scenario 1 – Overwrite a file at the destination with Move-Item

场景 2 – 确认后覆盖目标位置的文件

使用 -Confirm 参数,在覆盖文件之前先获取确认提示。

  • 如果目标文件夹中已经存在任意 PDF 文件,此 cmdlet 将显示确认提示。
      Move-Item -Path C:\Temp\*.pdf -Destination C:\Backup -Confirm -Force
      
  • 如果目标文件夹中已经存在 test.txt 文件,此 cmdlet 将显示确认提示。
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup -Confirm -Force
      

输入 Y 并按 Enter 以覆盖文件,或输入 N 并按 Enter 以跳过它们。

Scenario 2 – Overwrite a file at the destination after confirmation with Move-Item

执行前测试命令

可将 -WhatIf 参数与 Move-Item cmdlet 配合使用,以查看结果;也就是说,检查如果运行该 cmdlet 会发生什么。使用此参数时,cmdlet 不会实际运行,但会显示预期结果。因此,你可以放心地确认:该 cmdlet 不会移动任何原本不打算移动的项目。

场景 1 – 在不运行 cmdlet 的情况下查看预期结果

当你尝试使用 Move-Item cmdlet 将 C:\Temp 文件夹中的所有项目移动到 Backup 文件夹时,此 cmdlet 会显示结果。

      Move-Item -Path C:\Temp\* -Destination C:\Backup -WhatIf
      
Image

错误处理与日志记录

在使用 PowerShell 的 Move-Item cmdlet 时,你应该考虑实现错误处理和日志记录,以确保脚本按预期运行,并且任何问题都能轻松追踪和识别。PowerShell 提供:

  • 使用 Try-Catch 进行错误处理
  • Write-Log:写入日志文件

使用 Try-Catch 进行基础错误处理

下面是一个用于在移动文件时进行错误处理的基础 Try-Catch 块:

      Try {
    Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -ErrorAction Stop
} Catch {
    Write-Output "Error moving file: $_"
}
      
Basic error handling with Try-Catch with Move-Item

以下是你需要了解的内容。

  • Try 块会尝试运行 Move-Item cmdlet。
  • -ErrorAction Stop 参数会告诉 PowerShell:一旦出现问题(例如文件不存在或存在权限问题),就停止当前操作并抛出错误,然后进入 Catch 块。
  • -Catch 块会捕获 Move-Item cmdlet 抛出的错误。
  • Write-Output 会显示错误消息($_ 包含错误详情)。你也可以将 Write-Output 替换为诸如 Write-Log 之类的日志记录函数,以便将错误保存到日志文件中。

-ErrorAction 参数用于指定发生错误时应执行的操作。可能的取值有:

  • 停止 – 出现错误时将停止操作
  • 继续 – 出现错误后操作将继续
  • 静默继续 – 操作将忽略错误,并且不显示任何内容
  • 询问 – 发生错误时提示用户输入
  • 忽略 – 忽略错误

Active Directory 组管理最佳实践

了解更多

使用 PowerShell 进行文件管理的最佳实践

将 cmdlet 限制为一个源文件夹和一个目标文件夹

Move-Item cmdlet 不会在目标位置创建文件夹或目录结构。你也不能在同一时间从两个不同的源位置移动两个同名文件。因此,最好在一个 cmdlet 中指定一个源文件夹和一个目标文件夹。

规划文件组织方式

在大规模移动文件之前,尤其要清楚地了解自己的文件组织结构。首先,源目录需要妥善维护文件和文件夹的结构,这样在移动项目时,你就能知道正在移动的内容。其次,目标位置的文件夹结构必须定义清楚,确保每个项目都能按预期移动。这样有助于你轻松定位每个已移动的文件。

在示例数据上测试 cmdlet

在示例数据上测试 Move-Item cmdlet,确保结果符合预期。这将有助于发现并避免对覆盖(overwrites)或冲突(conflicts)的任何疏漏。

如果你没有足够的示例数据,或者想节省时间,可以使用 -WhatIf 参数在不实际运行 cmdlet 的情况下模拟移动。这样,你就可以在进行任何更改之前,通过测试 cmdlet 和脚本来查看结果。

保留备份

为防万一,在使用 Move-Item cmdlet 之前,请先备份所有重要文件和文件夹,尤其是那些会覆盖的文件——以避免之后迷失方向。

实现日志记录和错误处理

日志记录和错误处理是应对意外错误的有用工具。实施这些功能有助于识别并跟踪 Move-Item 操作中发生的任何错误。

你可以在 cmdlet 中使用 -ErrorAction 参数,或使用 try-catch 块来进行错误处理。

结论

PowerShell 的 Move-Item cmdlet 在管理和组织文件方面就像“施法”一样强大。它以简洁的基础语法同时满足初学者和高级用户,您可以通过参数和脚本在此基础上不断扩展功能。您可以移动单个文件、多个文件、隐藏文件和只读文件;也可以将整个目录及其全部内容移动到另一个位置;在移动文件的同时重命名;处理覆盖等——还能做更多。该 cmdlet 还支持日志记录和错误处理,以确保文件移动可靠且安全。

Netwrix Directory Manager

常见问题

如果目标位置已经存在同名文件,会发生什么?

当您使用 Move-Item cmdlet 试图移动文件,但目标位置已经存在同名文件时,将会发生以下情况之一:

  • 在不使用 -Force 参数的情况下运行 Move-Item cmdlet:
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt
      

cmdlet 会抛出错误,并且不会移动该文件。

  • 使用 -Force 参数时:
      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      

PowerShell 将在不请求确认的情况下覆盖目标位置的文件。这会用你正在移动的文件替换目标位置的文件。

有关更多信息,请参阅“Handle Overwrites”部分。

我可以一次移动多个文件吗?

可以的,使用 PowerShell 的 Move-Item 就能做到。你可以:

  • 移动相同扩展名的文件、不同扩展名的文件,以及从源目录根目录获取的所有文件。你可以使用以下 cmdlet 将源目录根目录下的所有文件移动:
      Get-ChildItem -Path C:\Temp\* -File | Move-Item -Destination C:\Backup
      

如需详细信息,请参阅“Move Multiple Files”部分。

  • 要从源目录递归移动所有相同扩展名的文件,请使用以下 cmdlet:
      Get-ChildItem -Path C:\Temp\*.pdf -Recurse | Move-Item -Destination C:\Backup
      

有关详细信息,请参阅“Recursive File Moving”部分。

  • 使用此 cmdlet 将源目录及其所有内容一起移动:
      Move-Item -Path C:\Temp -Destination C:\Backup
      

有关详细信息,请参阅“Move a Directory”部分。

如何移动具有特定属性的文件?

Move-Item cmdlet 可以根据特定条件(例如文件大小、上次修改日期等)移动文件。下面是可用于筛选的常见属性列表:

  • 隐藏
  • 只读
  • 归档
  • 已压缩
  • 已加密

在 Where-Object 筛选器中使用这些条件,以定位具有这些属性的文件。你也可以在 Where-Object 中使用 -and 或 -or 组合多个条件,从而筛选出具有多个属性的文件。

如需更多信息,请参阅“Filter Files”和“Advanced Moving Scenarios”主题。

可以使用 Move-Item 在不同驱动器之间移动文件吗?

简单的答案是:可以。文件会被移动到你指定的目标位置,无论该位置是与源驱动器相同,还是不同的驱动器。

如何使用 Move-Item 移动文件并进行覆盖?

如果要用正在移动的文件覆盖目标位置的文件,请在 Move-Item 中使用 -Force 参数。例如:

      Move-Item -Path C:\Temp\test.txt -Destination C:\Backup\test.txt -Force
      

PowerShell 会在不要求确认的情况下,用 Temp 文件夹中的 test.txt 文件替换 Backup 文件夹中的 test.txt 文件。有关更多信息,请参阅“Handle Overwrites”部分。

如何使用 PowerShell 移动隐藏文件?

在移动文件夹或移动同一扩展名的多个文件时,Move-Item cmdlet 不会移动隐藏文件或只读文件。请使用带有 -Force 参数的 Get-ChildItem cmdlet 将隐藏文件和系统文件包含在输出中,然后将结果通过管道传递给 Move-Item。

例如,你可以使用此 cmdlet 来移动所有文件(包括隐藏文件)。

      Get-ChildItem -Path C:\Temp\ -Force | Move-Item -Destination C:\Backup\
      

要专门移动隐藏文件(而不是可见文件),请使用此 cmdlet:

      Get-ChildItem -Path C:\Temp\ -Force | Where-Object { $_.Attributes -match 'Hidden' } | Move-Item -Destination C:\Backup\
      

由于你添加了用于筛选隐藏文件的条件,该 cmdlet 仅会移动设置了“Hidden”属性的文件。

使用 Move-Item 时常见的错误有哪些?我该如何进行故障排查?

下面给出了一些常见错误及其说明和解决方案。

文件已存在

当您尝试将文件或文件夹移动到目标位置,而该位置已存在同名文件时,将显示以下错误:

      Move-Item : Cannot create a file when that file already exists.
      

使用 -Force 参数来覆盖现有文件。

Access Denied

当您没有将文件移动所需的权限时,将显示以下错误:

      Move-Item : Access to the path 'C:\Path\to\file.txt' is denied.
      

原因可能有很多,例如文件受保护、目标文件夹需要管理员权限,或该文件正在被其他进程使用。

要解决此问题,请确保你拥有所需的权限。建议你以管理员身份运行 PowerShell。此外,请确认该文件未被其他应用程序占用。

文件被其他进程锁定

当要移动的文件正被其他程序或进程使用时,将显示以下错误:

      Move-Item : The process cannot access the file because it is being used by another process.
      

要解决此问题,请关闭任何正在使用该文件的应用程序。

路径过长

默认情况下,Windows 的最大路径长度为 260 个字符。如果源路径或目标路径超过此限制,Move-Item 将会失败。PowerShell 会显示以下错误:

      Move-Item : The specified path, file name, or both are too long.
      

要解决该问题,可以使用更短的目录或文件名,也可以在 Windows 10/11 或 Windows Server 中通过 Group Policy 或注册表启用长路径支持。

无效的路径或文件名

当源路径或目标路径不正确、拼写错误或不存在时,将显示以下错误:

      Move-Item : Cannot find path 'C:\InvalidPath\file.txt' because it does not exist.
      

请再次检查路径。

目标目录不存在

当目标目录不存在时,将显示以下错误:

      Move-Item : Could not find part of the path 'C:\Backup\'
      

请确保目标目录存在。否则,请在移动文件之前先创建它。

将目录移动到自身

PowerShell 不允许将目录移动到其某个子目录中。尝试这样做时,将显示以下错误:

      Move-Item : Cannot move item 'C:\Temp\' to a subdirectory of itself, 'C:\Temp\Logs\'.
      

请确保目标位置不是源目录的子文件夹。

是否可以根据文件内容来移动文件?

单独使用时,Move-Item cmdlet 无法根据文件内容移动文件。不过,你可以使用 Get-Content 或其他读取文件的方法,并结合条件逻辑(例如 If-Else 语句)来读取文件内容,然后使用 Move-Item 将文件按相应规则移动。

下面是一个示例脚本:检查文件是否包含特定单词或短语。如果包含,则会移动该文件。

注意: 在运行脚本之前,请进行以下更改:

  • 修改 $searchString 变量,以匹配你要筛选的内容。
  • 将 $sourceDirectory 和 $destinationDirectory 更改为相应的路径。
      $sourceDirectory = "C:\SourceFolder"
$destinationDirectory = "C:\DestinationFolder"
$searchString = "SpecificText"
# Get all files in the source directory
Get-ChildItem -Path $sourceDirectory -File | ForEach-Object {
    $filePath = $_.FullName
    # Read the content of the file
    $content = Get-Content -Path $filePath
    # Check if the file contains the search string
    if ($content -match $searchString) {
        # Move the file to the destination directory
        $destinationPath = Join-Path -Path $destinationDirectory -ChildPath $_.Name
        Move-Item -Path $filePath -Destination $destinationPath
        Write-Host "Moved file: $filePath to $destinationPath"
    }
    else {
        Write-Host "File does not contain search string: $filePath"
    }
}
      

Get-ChildItem 从源文件夹获取所有文件,ForEach-Object 会遍历每个文件。Get-Content 读取每个文件的内容,以检查内容是否与指定字符串匹配。然后,Move-Item 将包含该字符串的文件移动到目标文件夹。

如果我试图移动的文件不存在,或者源路径无效,会怎样?

无论是哪种情况,PowerShell 都会抛出错误。

      Move-Item : Cannot find path 'C:\Temp\AppLog.txt' because it does not exist.
      

同样地,如果目标路径的任何元素不存在,则该 cmdlet 会失败。它不会创建缺失的目录或路径中的任何元素。

一个不错的做法是运行 Test-Path 来检查文件是否存在。该 cmdlet 在路径的所有元素都存在时返回 $true,在任何元素缺失时返回 $false。

      Test-Path -Path C:\Backups\AppLogs
      

False

Image

分享到

了解更多

关于作者

Asset Not Found

Jonathan Blackwell

软件开发负责人

自 2012 年以来,工程师兼创新者 Jonathan Blackwell 一直提供工程领导力,使 Netwrix GroupID 成为 Active Directory 和 Azure AD 环境中群组与用户管理领域的领先者。他在研发、市场与销售方面的经验,使 Jonathan 能够全面理解 Identity 市场以及买家如何思考。