使用文件和文件夹
在 PowerShell 驱动器中导航和操作其中的项,类似于操作 Windows 磁盘驱动器上的文件和文件夹。 本文介绍如何使用 PowerShell 处理特定文件和文件夹操作任务。
列出某个文件夹内的所有文件和文件夹
可以使用 Get-ChildItem
直接获取文件夹中的所有项。 添加可选的 Force 参数以显示隐藏项或系统项。 例如,该命令直接显示 PowerShell 驱动器 C:
的内容。
Get-ChildItem -Path C:\ -Force
此命令只列出直接包含的项,非常类似于在 cmd.exe
中使用 dir
命令或在 UNIX shell 中使用 ls
。 为了显示子文件夹中的项,需要指定 Recurse 参数。
下面的命令列出了 C:
驱动器上的所有内容:
Get-ChildItem -Path C:\ -Force -Recurse
Get-ChildItem
可以使用 Path 、Filter 、Include 和 Exclude 参数来筛选项,但这些通常只以名称为依据。 使用 Where-Object
,还可以执行基于项的其他属性的复杂筛选。
下面的命令用于查找上次于 2005 年 10 月 1 日之后修改,并且不小于 1 兆字节,也不大于 10 兆字节的 Program Files 文件夹中的所有可执行文件:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
Where-Object -FilterScript {
($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
}
复制文件和文件夹
复制通过 Copy-Item
完成。 以下命令备份 PowerShell 配置文件脚本:
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}
Test-Path
命令检查配置文件脚本是否存在。
如果目标文件已存在,则复制尝试失败。 若要覆盖预先存在的目标,请使用 Force 参数 :
if (Test-Path -Path $PROFILE) {
Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}
即使当目标为只读时,该命令也有效。
复制文件夹的操作方式与此相同。 以下命令以递归方式将文件夹 C:\temp\test1
复制到新文件夹 C:\temp\DeleteMe
:
Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe
还可以复制选定的项。 下面的命令将 C:\data
中任意位置包含的所有 .txt
文件都复制到 C:\temp\text
:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text
你仍然可以运行 xcopy.exe
和 robocopy.exe
等本机命令来复制文件。
创建文件和文件夹
创建新项的操作方式在所有 PowerShell 提供程序上都是一样的。 如果某个 PowerShell 提供程序具有多个类型的项(例如,用于区分目录和文件的 FileSystem PowerShell 提供程序),则需要指定项类型。
以下命令新建文件夹 C:\temp\New Folder
:
New-Item -Path 'C:\temp\New Folder' -ItemType Directory
以下命令新建空的文件 C:\temp\New Folder\file.txt
New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File
重要
结合使用 Force 开关与 New-Item
命令来创建文件夹时,如果文件夹已存在,则不会 覆盖或替换此文件夹。 它会直接返回现有的文件夹对象。 不过,如果对已存在的文件使用 New-Item -Force
,该文件会被覆盖。
删除某个文件夹内的所有文件和文件夹
可以使用 Remove-Item
来删除包含的项,但如果项包含其他任何内容,系统就会提示你确认是否要删除。 例如,如果尝试删除包含其他项的文件夹 C:\temp\DeleteMe
,在删除此文件夹前,PowerShell 会提示你确认是否要删除:
Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help
(default is "Y"):
如果不希望系统针对每个包含的项都提示你,则指定 Recurse 参数:
Remove-Item -Path C:\temp\DeleteMe -Recurse
将本地文件夹映射为驱动器
还可以使用 New-PSDrive
命令来映射本地文件夹。 以下命令在本地 Program Files 目录中的根位置创建本地驱动器 P:
(只在 PowerShell 会话中可见):
New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem
正如网络驱动器一样,在 PowerShell 内映射的驱动器将对 PowerShell shell 立即可见。 若要创建从文件资源管理器可见的映射驱动器,请使用 Persist 参数。 不过,只有远程路径才能与 Persist 一起使用。
将文本文件数据读取到数组中
文本数据更常见的存储格式之一是采用文件形式,其中单独的行被视为不同的数据元素。 Get-Content
cmdlet 可用于一步读取整个文件,如下所示:
Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs
Get-Content
将从文件读取的数据视为数组,其中每行文件内容为一个元素。 可以通过检查返回的内容的长度来确认此点:
PS> (Get-Content -Path $PROFILE).Length
3
此命令对于从 PowerShell 获取列表信息最为有用。 例如,你可能会在文件 C:\temp\domainMembers.txt
中存储计算机名或 IP 地址的列表,文件的每一行上都有一个名称。 可以使用 Get-Content
来检索文件内容,并将它们放置在变量 $Computers
中:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt
$Computers
现在是数组,其中每个元素包含一个计算机名。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈