PowerShell 学习笔记 - 5 操作文件

PowerShell 学习笔记 - 5 操作文件

本章主要承接第4章中关于文件系统的话题,探讨 PowerShell 中如何进行基本的文件操作等,也据此作为第一部分的总结。

Location 与 Item

PowerShell 中将 UNIX 常用的 cd / pwd / pushd / popd 通过别名的方式提供了出来,也标识出路径所对应的名词应当是 Location

# PowerShell Core 下的导航
PS /> Get-Alias cd

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           cd -> Set-Location


PS /> Get-Alias pwd

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           pwd -> Get-Location
PS /> Get-Alias popd

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           popd -> Pop-Location


PS /> Get-Alias pushd

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           pushd -> Push-Location

Get-Location 所返回的对象并不包含详细的作为文件对象的信息,用于获取详细信息的的即为 Get-ItemGet-ItemProperty

# Get-Location 返回的对象不包含详细的文件信息,只是提供该 Location 相对于 Provider 下的信息
PS /root> Get-Location | Get-Member -MemberType Property
   TypeName: System.Management.Automation.PathInfo
Name         MemberType Definition
----         ---------- ----------
Drive        Property   System.Management.Automation.PSDriveInfo Drive {get;}
Path         Property   string Path {get;}
Provider     Property   System.Management.Automation.ProviderInfo Provider {get;}
ProviderPath Property   string ProviderPath {get;}

# Get-Item 用于获取路径对应的对象,其所携带的便该对象的详细信息
PS /root> Get-Item -Path .| Get-Member -MemberType Property
   TypeName: System.IO.DirectoryInfo
Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
Exists            Property   bool Exists {get;}
Extension         Property   string Extension {get;}
FullName          Property   string FullName {get;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}
Name              Property   string Name {get;}
Parent            Property   System.IO.DirectoryInfo Parent {get;}
Root              Property   System.IO.DirectoryInfo Root {get;}

通过 Get-ChildItem 亦可获得该路径下的所有子对象,并可对其进行操作:

PS /> Get-ChildItem -Path .
    Directory: /
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d----l           8/4/18  10:04 PM                bin
d-----          9/19/18   5:52 AM                dev
d-----          9/15/18   5:52 AM                etc
d-----          4/11/18   4:59 AM                home
d----l           8/4/18  10:04 PM                lib
d----l           8/4/18  10:04 PM                lib64
d-----          4/11/18   4:59 AM                media
d-----          4/11/18   4:59 AM                mnt
d-----          9/13/18  11:37 PM                opt
d-r---          9/19/18   5:52 AM                proc
d-r---          9/15/18   5:52 AM                root
d-----          9/18/18   3:51 AM                run
d----l           8/4/18  10:04 PM                sbin
d-----          4/11/18   4:59 AM                srv
d-r---          9/19/18   5:52 AM                sys
d-----          9/19/18   5:52 AM                tmp
d-----           8/4/18  10:04 PM                usr
d-----           8/4/18  10:04 PM                var
------           8/4/18  10:05 PM          12005 anaconda-post.log

# 从 ChildItem 中选取 Item
PS /> (Get-ChildItem -Path .)[0]
    Directory: /
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d----l           8/4/18  10:04 PM                bin

# 也可附加 -Recursive 以进行递归搜索,这样将获取该路径下的所有 Item
# 例如在 /opt 下有 526 个 Item
PS /> (Get-ChildItem -Path /opt -Recurse).Length
526

# 同时也可附加 -Include 以筛选部分需要的 Item
# 例如在 /opt 下面有 400 个 DLL 库
PS /> (Get-ChildItem -Path /opt -Recurse -Include *.DLL).Length
400

文件(对象)操作

文件(对象)操作均依赖于 *-Item cmdlet 族:

PS /tmp> Get-Command -noun item

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Clear-Item                                         6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Copy-Item                                          6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Get-Item                                           6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Invoke-Item                                        6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Move-Item                                          6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          New-Item                                           6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Remove-Item                                        6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Rename-Item                                        6.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Set-Item                                           6.1.0.0    Microsoft.PowerShell.Management

文件或路径等创建,可使用 New-Item

# 创建 Directory 类型的文件,即为目录
PS /tmp> New-Item -ItemType Directory newDir
    Directory: /tmp
Mode                LastWriteTime         Length Name
----                -------------         ------ ----

# 创建 File 类型的文件,即为普通文件
PS /tmp> New-Item -ItemType File newFile
    Directory: /tmp
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          9/19/18   6:38 AM              0 newFile

# 创建 SymbolicLink 类型的文件,即为符号链接
PS /tmp> New-Item -Name yum.log.link -Type SymbolicLink -Value ./yum.log
    Directory: /tmp
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-----l          9/19/18   6:42 AM             12 yum.log.link

文件或路径等移动 / 复制 / 删除 / 重命名等,可使用 Move / Copy / Remove / Rename-Item

PS /tmp> Move-Item -Path ./newFile -Destination ./newDir/
PS /tmp> Copy-Item -Path ./newDir/newFile -Destination ./

# newDir 非空,所以在删除时可以加上递归,以省略到确认过程
PS /tmp> Remove-Item -Force ./newDir/

Confirm
The item at /tmp/newDir/ 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"):
PS /tmp> Remove-Item -Recurse ./newDir/

PS /tmp> Rename-Item -Path ./newFile -NewName nextFile
PS /tmp> Get-Item ./nextFile
    Directory: /tmp
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
------          9/19/18   6:38 AM              0 nextFile

Invoke-Item 用于打开文件,主要见于 Windows 平台,UNIX 平台直接使用 CLI 调用二进制即可:

# 运行于 Windows 上,将打开 .log 格式绑定的默认应用程序
PS C:\Users\chuny> Invoke-Item  .\AMDRM_Install.log

Clear-Item 主要用于 Windows 平台清理某个注册表中的值集合,不常用。

操作文件属性,依靠 Item 对象属性相关的 getter / setter 函数,即 Get / Set-ItemProperty

PS /tmp> (Get-ItemProperty ./yum.log).IsReadOnly
False
PS /tmp> Set-ItemProperty ./yum.log -Name isReadOnly -Value $true
PS /tmp> (Get-ItemProperty ./yum.log).IsReadOnly
True

你可能感兴趣的:(PowerShell 学习笔记 - 5 操作文件)