`

PowerShell基础教程(23)——处理文件和文件夹

阅读更多

PowerShell基础教程(23)——处理文件和文件夹             <o:p></o:p>

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

列出文件夹中的所有文件和文件夹<o:p></o:p>

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

Get-ChildItem -Force C:\<o:p></o:p>

<o:p> </o:p>

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

Get-ChildItem -Force C:\ -Recurse<o:p></o:p>

<o:p> </o:p>

Get-ChildItem 可以使用其 PathFilterInclude 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)}<o:p></o:p>

<o:p> </o:p>

复制文件和文件夹<o:p></o:p>

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

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak<o:p></o:p>

<o:p> </o:p>

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

Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force<o:p></o:p>

<o:p> </o:p>

甚至在目标为只读时此命令也有效。

复制文件夹的方法与此相同。以下命令以递归方式将文件夹 C:\temp\test1 复制到新文件夹 c:\temp\DeleteMe

Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe<o:p></o:p>

<o:p> </o:p>

也可以复制所选项。以下命令将 c:\data 中任何位置所包含的所有 .txt 文件复制到 c:\temp\text

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text<o:p></o:p>

<o:p> </o:p>

仍然可以使用其他工具执行文件系统复制。XCOPYROBOCOPY 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")<o:p></o:p>

<o:p> </o:p>

创建文件和文件夹<o:p></o:p>

在所有 Windows PowerShell 提供程序中创建新项的方法都是相同的。如果 Windows PowerShell 提供程序具有多种类型的项(例如,FileSystem Windows PowerShell 提供程序区分目录和文件),则需要指定项类型。

以下命令创建新文件夹 C:\temp\New Folder

New-Item -Path 'C:\temp\New Folder' -ItemType "directory"<o:p></o:p>

<o:p> </o:p>

以下命令创建新的空文件 C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType "file"<o:p></o:p>

<o:p> </o:p>

删除文件夹中的所有文件和文件夹<o:p></o:p>

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

Remove-Item C:\temp\DeleteMe<o:p></o:p>

<o:p> </o:p>

确认<o:p></o:p>

C:\temp\DeleteMe 中的项具有子项并且没有指定 -recurse 参数。如果继续,所有子项均将随该项删除。是否确实要继续?<o:p></o:p>

[Y]   [A] 全是  [N]   [L] 全否  [S] 挂起  [?] 帮助<o:p></o:p>

默认值为Y”):<o:p></o:p>

<o:p> </o:p>

如果对于每个包含的项不希望被提示请指定 Recurse 参数

Remove-Item C:\temp\DeleteMe -Recurse<o:p></o:p>

<o:p> </o:p>

将本地文件夹映射为 Windows 可访问驱动器<o:p></o:p>

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

subst p:$env:programfiles<o:p></o:p>

<o:p> </o:p>

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

将文本文件读入数组<o:p></o:p>

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

PS> Get-Content -Path C:\boot.ini<o:p></o:p>

[boot loader]<o:p></o:p>

timeout=5<o:p></o:p>

default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS<o:p></o:p>

[operating systems]<o:p></o:p>

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"<o:p></o:p>

/noexecute=AlwaysOff /fastdetect<o:p></o:p>

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional <o:p></o:p>

with Data Execution Prevention" /noexecute=optin /fastdetect<o:p></o:p>

<o:p> </o:p>

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

PS> (Get-Content -Path C:\boot.ini).Length<o:p></o:p>

6<o:p></o:p>

<o:p> </o:p>

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

$Computers = Get-Content -Path C:\temp\DomainMembers.txt<o:p></o:p>

<o:p> </o:p>

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

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics