借助 PowerShell FileSystem 提供程序,可以在 PowerShell 中获取、添加、更改、清除和删除文件和目录。

FileSystem 驱动器是一个分层命名空间,其中包含计算机上的目录和文件。 FileSystem 驱动器可以是逻辑或物理驱动器、目录或映射网络共享。

从 PowerShell 版本 7.0 开始,名为 的 TEMP: 驱动器将映射到用户的临时目录路径。 PowerShell 使用 .NET GetTempPath () 方法确定临时文件夹的位置。 在 Windows 上,位置与 $env:TEMP 相同。 在非 Windows 系统上,如果未定义环境变量,则位置与 $env:TMPDIR /tmp 相同。

FileSystem 提供程序支持本文中介绍的以下 cmdlet。

  • Get-Location
  • Set-Location
  • Get-Item
  • Get-ChildItem
  • Invoke-Item
  • Move-Item
  • New-Item
  • Remove-Item
  • Get-ItemProperty
  • Set-ItemProperty
  • Clear-Item
  • Clear-ItemProperty
  • Remove-Item
  • Remove-ItemProperty
  • Get-Acl
  • Set-Acl
  • Get-AuthenticodeSignature
  • Set-AuthenticodeSignature
  • Add-Content
  • Clear-Content
  • Get-Content
  • Set-Content
  • 此提供程序公开的类型

    文件是 System.IO.FileInfo 类的实例。 目录是 System.IO.DirectoryInfo 类的实例。

    PowerShell 扩展类型系统向这些对象类型添加额外的属性以提供其他信息。 某些信息特定于平台。 例如, LinkType 属性的可能值取决于所使用的平台和文件系统。 Linux 和 macOS 文件系统支持 HardLink SymLink 。 Windows NTFS 支持 HardLink SymLink Junction LinkType 的其他几个值。

    使用 Get-Item Get-ChildItem 来提供有关链接项的信息时, Mode 属性包含 用于 l 指示该项是链接的 。 LinkType 属性包含链接的类型。

    AppExecLink 从 Microsoft Store 安装应用程序时会创建链接。 对于 AppExecLink 链接,Windows 不提供 LinkType LinkTarget 属性的值。

    Get-Item ~\AppData\Local\Microsoft\WindowsApps\winget.exe
        Directory: C:\Users\user1\AppData\Local\Microsoft\WindowsApps
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    la---            6/8/2023 12:20 PM              0 winget.exe ->
    
    

    FileSystem 提供程序通过将计算机上的任何逻辑驱动器映射为 PowerShell 驱动器来公开其数据存储。 若要使用 FileSystem 驱动器,可以使用驱动器名称后跟冒号 (:) 将位置更改为驱动器。

    Set-Location C:
    

    还可以使用任何其他 PowerShell 驱动器中的 FileSystem 提供程序。 若要从另一个位置引用文件或目录,请在路径中使用驱动器名称 (C:D:、 ...) 。

    PowerShell 使用别名使你能够以熟悉的方式处理提供程序路径。 命令(如 dirls )现在是 的 Get-ChildItem别名, cd 是 的 Set-Location别名。 和 pwd 是 的 Get-Location别名。

    获取文件和目录

    cmdlet Get-ChildItem 返回当前位置中的所有文件和目录。 可以指定其他路径进行搜索,并使用内置参数筛选和控制递归深度。

    Get-ChildItem
    

    若要了解有关 cmdlet 用法的详细信息,请参阅 Get-ChildItem

    复制文件和目录

    cmdlet Copy-Item 将文件和目录复制到指定的位置。 参数可用于筛选和递归,类似于 Get-ChildItem

    以下命令将文件夹 C:\Windows\Temp路径C:\temp\下的所有文件和目录复制到 。

    Copy-Item -Path C:\temp\* -Destination C:\Windows\Temp -Recurse -File
    

    Copy-Item 覆盖目标目录中的文件,而不提示确认。

    此命令将 a.txt 文件从 C:\a 目录复制到 C:\a\bb 目录。

    Copy-Item -Path C:\a\a.txt -Destination C:\a\bb\a.txt
    

    将目录中的所有目录和文件 C:\a 复制到目录中 C:\c 。 如果目标目录中已存在任何要复制的目录,除非指定 Force 参数,否则命令将失败。

    Copy-Item -Path C:\a\* -Destination C:\c -Recurse
    

    有关详细信息,请参阅 Copy-Item

    移动文件和目录

    此命令将 c.txt 目录中的文件 C:\a 移动到 C:\a\aa 目录:

    Move-Item -Path C:\a\c.txt -Destination C:\a\aa
    

    默认情况下,cmdlet 不会覆盖同名的现有文件。 若要强制 cmdlet 覆盖现有文件,请指定 Force 参数。

    当某个目录是当前位置时,无法移动该目录。 使用 Move-Item 移动当前位置的目录时,会看到此错误。

    C:\temp> Move-Item -Path C:\temp\ -Destination C:\Windows\Temp
    Move-Item : Cannot move item because the item at 'C:\temp\' is in use.
    At line:1 char:1
    + Move-Item C:\temp\ C:\temp2\
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [Move-Item], PSInvalidOperationException
        + FullyQualifiedErrorId : InvalidOperation,Microsoft.PowerShell.Commands.MoveItemCommand
    

    管理文件内容

    获取文件的内容

    此命令获取“Test.txt”文件的内容,并在控制台中显示它们。

    Get-Content -Path Test.txt
    

    你可以通过管道将文件内容传递给其他 cmdlet。 例如,以下命令读取文件的内容 Test.txt ,然后将其作为 输入提供给 ConvertTo-Html cmdlet:

    Get-Content -Path Test.txt | ConvertTo-Html
    

    还可以通过在文件的提供程序路径前面加上美元符号 () $ 来检索文件的内容。 由于变量命名限制,路径必须括在大括号中。 有关详细信息,请参阅 about_Variables

    ${C:\Windows\System32\Drivers\etc\hosts}
    

    向文件添加内容

    此命令将“测试内容”字符串追加到 Test.txt 文件中:

    Add-Content -Path test.txt -Value "test content"
    

    不会删除文件中的现有内容 Test.txt

    替换文件的内容

    此命令将文件的内容 Test.txt 替换为“测试内容”字符串:

    Set-Content -Path test.txt -Value "test content"
    

    它覆盖 的内容 Test.txt。 创建文件时,可以使用 cmdlet 的 New-ItemValue 参数将内容添加到该文件。

    循环访问文件的内容

    默认情况下, Get-Content cmdlet 使用行尾字符作为其分隔符,因此它获取文件作为字符串集合,其中每行作为文件中的一个字符串。

    可以使用 Delimiter 参数指定备用分隔符。 如果将该分隔符设置为表示一个部分的结尾或下一部分开头的字符,则可以将该文件拆分为多个逻辑部分。

    第一个命令获取 Employees.txt 文件并将其拆分为多个部分,每个部分以单词“结束员工记录”结尾,并将它保存在 变量中 $e

    第二个命令使用数组表示法获取 集合中的 $e第一项。 它使用索引 0,因为 PowerShell 数组是从零开始的。

    有关 cmdlet 的详细信息 Get-Content ,请参阅 的 Get-Content帮助主题。

    有关数组的详细信息,请参阅 about_Arrays

    $e = Get-Content c:\test\employees.txt -Delimited "End Of Employee Record"
    $e[0]
    

    管理安全描述符

    查看文件的 ACL

    此命令返回 System.Security.AccessControl.FileSecurity 对象:

    Get-Acl -Path test.txt | Format-List -Property *
    

    有关此对象的详细信息,请通过管道将命令传递给 Get-Member cmdlet 或参阅 FileSecurity 类。

    创建文件和目录

    此命令在 logfiles 驱动器上 C 创建目录:

    New-Item -Path c:\ -Name logfiles -Type directory
    

    PowerShell 还包括一个 mkdir 函数 (别名 md) ,该 New-Item 函数使用 cmdlet 创建新目录。

    此命令在 目录中创建 log2.txt 文件, C:\logfiles 然后将“测试日志”字符串添加到该文件:

    New-Item -Path c:\logfiles -Name log2.txt -Type file
    

    创建具有内容的文件

    在 目录中创建名为 log2.txt 的文件, C:\logfiles 并将字符串“test log”添加到该文件。

    New-Item -Path c:\logfiles -Name log2.txt -Type file -Value "test log"
    

    重命名文件和目录

    重命名文件

    此命令将 目录中的文件a.txtC:\a重命名为 b.txt

    Rename-Item -Path c:\a\a.txt -NewName b.txt
    

    重命名目录

    此命令将 C:\a\cc 目录重命名为 C:\a\dd

    Rename-Item -Path c:\a\cc -NewName dd
    

    删除文件和目录

    此命令删除 Test.txt 当前目录中的文件:

    Remove-Item -Path test.txt
    

    使用通配符删除文件

    此命令删除当前目录中文件扩展名为 .xml 的所有文件:

    Remove-Item -Path *.xml
    

    通过调用关联的文件启动程序

    Get-Service cmdlet 用于获取有关本地服务的信息,并通过管道将信息传递给 Export-Csv cmdlet 以将信息存储在文件中Services.csv

    然后,Invoke-Item 在与扩展名关联的.csv程序中打开services.csv文件:

    Get-Service | Export-Csv -Path services.csv
    Invoke-Item -Path services.csv
    

    获取具有指定属性的文件和文件夹

    获取系统文件

    此命令将获取当前目录及其子目录中的系统文件。

    它使用 File 参数仅获取 (不获取目录) 的文件,并使用 System 参数仅获取具有“system”属性的项。

    它使用 Recurse 参数获取当前目录和所有子目录中的项。

    Get-ChildItem -File -System -Recurse
    

    获取隐藏的文件

    此命令将获取当前目录中的所有文件,其中包括隐藏文件。

    它使用 Attributes 参数和两个值, !Directory+Hidden用于获取隐藏的文件和 !Directory获取所有其他文件。

    Get-ChildItem -Attributes !Directory,!Directory+Hidden
    

    dir -att !d,!d+h 等效于此命令。

    获取压缩和加密文件

    此命令将获取当前目录中已压缩或加密的文件。

    它使用 Attributes 参数和 两个值 CompressedEncrypted。 这些值用表示“OR”运算符的逗号 , 分隔。

    Get-ChildItem -Attributes Compressed,Encrypted
    

    动态参数是由 PowerShell 提供程序添加的 cmdlet 参数,仅在启用提供程序的驱动器中使用 cmdlet 时才可用。

    编码 <编码>

    指定文件编码。 默认值为 ASCII。

  • ascii:使用 ASCII (7 位) 字符集的编码。
  • bigendianunicode:使用 big-endian 字节顺序以 UTF-16 格式进行编码。
  • bigendianutf32:使用 big-endian 字节顺序以 UTF-32 格式进行编码。
  • oem:对 MS-DOS 和控制台程序使用默认编码。
  • unicode:使用 little-endian 字节顺序以 UTF-16 格式进行编码。
  • utf7:以 UTF-7 格式编码。
  • utf8:以 UTF-8 格式编码。
  • utf8BOM:使用字节顺序标记 (BOM) 以 UTF-8 格式进行编码
  • utf8NoBOM:不带字节顺序标记的 UTF-8 格式编码 (BOM)
  • utf32:以 UTF-32 格式编码。
  • 支持的 Cmdlet

  • Add-Content
  • Get-Content
  • Set-Content
  • 分隔符 <字符串>

    指定在读取文件时使用 分隔符 Get-Content 将文件划分为对象。

    默认值为 \n,即行尾字符。

    读取文本文件时, Get-Content 返回字符串对象的集合,其中每个对象都以分隔符字符结尾。

    输入文件中不存在的分隔符会将 Get-Content 整个文件作为单个未分隔的对象返回。

    你可以使用此参数将大文件拆分为较小的文件,方法是指定文件分隔符(例如“End of Example”)作为分隔符。 分隔符将被保留(不会被丢弃),并且成为每个文件部分中的最后一项。

    目前,当 Delimiter 参数的值为空字符串时, Get-Content 不会返回任何内容。 这是已知问题。 若要强制 Get-Content 将整个文件作为单个未计算的字符串返回,请输入文件中不存在的值。

    支持的 Cmdlet

  • Get-Content
  • Wait <SwitchParameter>

    等待要追加到文件的内容。 如果已追加内容,则返回追加的内容。 如果已更改内容,则返回整个文件。

    等待时, Get-Content 每秒检查一次文件,直到中断它,例如按 Ctrl+C。

    支持的 Cmdlet

  • Get-Content
  • Attributes <FlagsExpression>

    获取具有指定属性的文件和文件夹。 此参数支持所有属性,并且允许你指定复杂的属性组合。

    Attributes 参数是在 Windows PowerShell 3.0 中引入的。

    Attributes 参数支持以下属性:

  • Compressed
  • Directory
  • Hidden
  • NotContentIndexed
  • Offline
  • ReadOnly
  • ReparsePoint
  • SparseFile
  • 有关这些属性的说明,请参阅 FileAttributes 枚举。

    使用以下运算符合并属性。

    运算符与其属性之间不允许有空格。 但是,在逗号之前允许有空格。

    支持的 Cmdlet

  • Get-ChildItem
  • Directory <SwitchParameter>

    获取目录(文件夹)。

    Windows PowerShell 3.0 中引入了 Directory 参数。

    若要仅获取目录,请使用 Directory 参数并省略 File 参数。 若要排除目录,请使用 File 参数并省略 Directory 参数,或使用 Attributes 参数。

    支持的 Cmdlet

  • Get-ChildItem
  • 文件 <SwitchParameter>

    获取文件。

    File 参数是在 Windows PowerShell 3.0 中引入的。

    若要仅获取文件,请使用 File 参数并省略 Directory 参数。 若要排除文件,请使用 Directory 参数并省略 File 参数,或使用 Attributes 参数。

    支持的 Cmdlet

  • Get-ChildItem
  • 隐藏 <的 SwitchParameter>

    仅获取隐藏的文件和目录(文件夹)。 默认情况下, Get-ChildItem 仅获取非隐藏项。

    Hidden 参数是在 Windows PowerShell 3.0 中引入的。

    若要仅获取隐藏项,请使用 Hidden 参数、其 hah 别名或 Attributes 参数的 Hidden 值。 若要排除隐藏项,请省略 Hidden 参数或使用 Attributes 参数。

    支持的 Cmdlet

  • Get-ChildItem
  • ReadOnly <SwitchParameter>

    仅获取只读文件和目录(文件夹)。

    ReadOnly 参数是在 Windows PowerShell 3.0 中引入的。

    若要仅获取只读项,请使用 ReadOnly 参数、其ar别名或 Attributes 参数的 ReadOnly 值。 若要排除只读项,请使用 Attributes 参数。

    支持的 Cmdlet

  • Get-ChildItem
  • System <SwitchParameter>

    仅获取系统文件和目录(文件夹)。

    System 参数是在 Windows PowerShell 3.0 中引入的。

    若要仅获取系统文件和文件夹,请使用 System 参数、其as别名或 Attributes 参数的 System 值。 若要排除系统文件和文件夹,请使用 Attributes 参数。

    支持的 Cmdlet

  • Get-ChildItem
  • NewerThan <DateTime>

    $True当文件的值大于指定日期时LastWriteTime返回 。 否则,它将返回 $False

    输入 DateTime 对象(例如 Get-Date cmdlet 返回的对象)或可以转换为 DateTime 对象的字符串,例如 "August 10, 2011 2:00 PM"

    支持的 Cmdlet

  • Test-Path
  • OlderThan <DateTime>

    $True当文件的值小于指定日期时LastWriteTime返回 。 否则,它将返回 $False

    输入 DateTime 对象(例如 cmdlet 返回的对象 Get-Date )或可以转换为 DateTime 对象的字符串,例如 "August 10, 2011 2:00 PM"

    支持的 Cmdlet

  • Test-Path
  • 流 <字符串>

    管理备用数据流。 输入流名称。 仅允许在 文件系统驱动器中的 和 Remove-Item 命令中使用Get-Item通配符。

    支持的 Cmdlet

  • Add-Content
  • Clear-Content
  • Get-Item
  • Get-Content
  • Remove-Item
  • Set-Content
  • 原始 <SwitchParameter>

    忽略换行符。 返回作为单个项的内容。

    支持的 Cmdlet

  • Get-Content
  • ItemType <字符串>

    此参数允许你指定用于创建的项的 tye New-Item

    此参数的可用值取决于所使用的当前提供程序。

    在驱动器中 FileSystem ,允许使用以下值:

  • Directory
  • SymbolicLink
  • HardLink
  • 支持的 Cmdlet

  • New-Item
  • 提供程序 cmdlet 接受管道输入。 可以通过将提供程序数据从一个 cmdlet 发送到另一个提供程序 cmdlet 来使用管道来简化任务。 若要详细了解如何将管道与提供程序 cmdlet 配合使用,请参阅本文中提供的 cmdlet 参考。

    从 Windows PowerShell 3.0 开始,你可以获取有关提供程序 cmdlet 的自定义帮助主题,它们介绍了这些 cmdlet 在文件系统驱动器中的行为方式。

    若要获取为文件系统驱动器自定义的帮助主题,请在文件系统驱动器中运行 Get-Help 命令,或使用 的 Get-HelpPath 参数指定文件系统驱动器。

    Get-Help Get-ChildItem
    
    Get-Help Get-ChildItem -Path c:
    
  • about_Providers
  •