在 Windows PowerShell 驱动器中导航和操作这些驱动器上的项目,与操作 Windows 物理磁盘驱动器上的文件和文件夹类似。本部分将讨论如何处理特定的文件和文件夹操作任务。

列出文件夹中的所有文件和文件夹

可以使用 Get-ChildItem 获取文件夹中直接包含的所有项。添加可选的 Force 参数可以显示隐藏项或系统项。例如,以下命令显示 Windows PowerShell 驱动器 C(与 Windows 物理驱动器 C 相同)的直接内容:

Get-ChildItem -Force C:\

该命令仅列出直接包含的项,与使用 Cmd.exe 的 DIR 命令或 UNIX shell 中的 ls 非常类似。为了显示包含的项,还需要指定 -Recurse 参数。(这可能需要极长的时间才能完成。)列出 C 驱动器上的所有内容:

Get-ChildItem -Force C:\ -Recurse

Get-ChildItem 可以通过其 PathFilterIncludeExclude 参数对项进行筛选,但是这些参数通常仅基于名称。使用 Where-Object,可以基于项的其他属性执行复杂的筛选。

以下命令查找 Program Files 文件夹中上次修改日期晚于 2005 年 10 月 1 日并且既不小于 1 MB 也不大于 10 MB 的所有可执行文件:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}

复制文件和文件夹

复制是使用 Copy-Item 进行的。以下命令将 C:\boot.ini 备份到 C:\boot.bak:

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak

如果目标文件已经存在,则复制尝试将会失败。若要覆盖预先存在的目标,请使用 Force 参数:

Copy-Item -Path c:\boot.ini -Destination c:\boot.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、ROBOCOPY 和 COM 对象(如 Scripting.FileSystemObject,)均可以在 Windows PowerShell 中使用。例如,可以使用 Windows Script Host Scripting.FileSystem COM 类将 C:\boot.ini 备份到 C:\boot.bak:

(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")

创建文件和文件夹

在所有 Windows PowerShell 提供程序中,创建新项的方法都是相同的。如果 Windows PowerShell 提供程序具有多种类型的项(例如,FileSystem Windows 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"

删除文件夹中的所有文件和文件夹

可以使用 Remove-Item 删除包含的项,但是如果该项包含任何其他内容,则会提示您确认删除。例如,如果尝试删除包含其他项的文件夹 C:\temp\DeleteMe,Windows PowerShell 会在删除该文件夹之前提示您进行确认:

Remove-Item C:\temp\DeleteMe

Confirm
The item at C:\temp\DeleteMe has children and the -recurse parameter was not
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 C:\temp\DeleteMe -Recurse

将本地文件夹映射为 Windows 可访问驱动器

也可以使用 subst 命令映射本地文件夹。以下命令创建位于本地 Program Files 目录中的本地驱动器 P::

subst p: $env:programfiles

就像网络驱动器一样,使用 subst 在 Windows PowerShell 中映射的驱动器立即对 Windows PowerShell shell 可见。

将文本文件读入数组

文本数据的更常见存储格式之一是,存储在将不同行视为不同数据元素的文件中。可以使用 Get-Content cmdlet 一次性读取整个文件,如下所示:

PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
 /noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional 
with Data Execution Prevention" /noexecute=optin /fastdetect

Get-Content 已将从文件中读取的数据视为一个数组,文件内容的每一行上有一个元素。可以通过检查所返回内容的 Length 对此进行确认:

PS> (Get-Content -Path C:\boot.ini).Length
6

对于直接从 Windows PowerShell 获取信息列表,此命令是最有用的。例如,可能将计算机名称或 IP 地址的列表存储在文件 C:\temp\domainMembers.txt 中,文件的每行上有一个名称。可以使用 Get-Content 检索文件内容,并将其放置在变量 $Computers 中:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers 现在是其每个元素中都包含计算机名称的数组。




目录