在 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 可以通过其 Path、Filter、Include 和 Exclude 参数对项进行筛选,但是这些参数通常仅基于名称。使用 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 现在是其每个元素中都包含计算机名称的数组。