概述
脚本与系统交互过程中,最为频繁的是与文件系统的交互。作为一个管理工具,PowerShell 提供了很多命令来完成这些操作。
创建
目录
1 | mkdir "dir-path-or-name" |
PowerShell 的命令名称通常是比较冗长的,为了兼容常用的操作命令,PowerShell 内置了很多别名。比如,创建目录我们更常用的是别名
md。
文件
PowerShell 中创建空白文件不需要借助重定向等,有专门的命令(虽然有点长):
1 | New-Item "filename" -type File |
驱动器
PowerShell 支持将普通目录虚拟为驱动器:
1 | # 为“桌面”创建驱动器 |
注意,创建的驱动器只是临时的,重启会话就会丢失,除非写入启动脚本中。
读与写
文本文件
下面 2 种方式可以一次性将文本文件的全部内容读取:
1 | Get-Content $file |
变量符号快捷方式读入字符集跟控制台编码有关,可能存在问题,不建议使用。而使用
Get-Content命令时应指定-encoding。另外,尽量使用
Get-Content自带的过滤器,不应通过管道来过滤。请仔细阅读
Get-Content的帮助文档。
要将内容输出到新文件有以下 3 种方式:
1 | dir > redirect-file.txt |
需要注意它们输出的差异,重定向与 Out-File 命令输出是一致的,但是 Set-Content 命令不自动转换对象为文本,而是抽取一个标准属性,因此,输出可能不同与前两者。
追加内容到文件有 2 种方式:
1 | Add-Content append.txt "Second line" -encoding UTF8 |
重定向命令输出字符集跟控制台编码有关,可能存在问题,不建议使用。应使用其他命令并指定
-encoding。
CSV
PowerShell 对 CSV 格式的文件提供直接的命令支持,导出和导入命令分别为 Export-CSV 和 Import-CSV。
请仔细阅读相关帮助文档。
修改和删除
1 | Copy-Item "from" "to" [-recurse] |
其他常见操作
导航
1 | # 当前工作目录 |
cd是命令Set-Location的别名。频繁在目录间切换的任务而言,
Push-Location和Pop-Location很有用。
例举目录内容
1 | dir folder-path |
dir和ls都是命令Get-ChildItem的别名,只是一个是 Windows 风格,一个是 Linux 风格。注意该命令自带有递归和过滤参数。详细请查看帮助文档。
路径处理
1 | # 相对路径转绝对路径 |
路径检测判断
1 | # 路径存在检测 |
杂项
路径中特殊符号需转义,如:`[ 和 `]
参考
[system.IO.Path] 方法
| 方法 | 描述 | 示例 |
|---|---|---|
| ChangeExtension() | 更改文件的扩展名 | ChangeExtension(“test.txt”, “ps1”) |
| Combine() | 拼接路径字符串; 对应Join-Path | Combine(“C:\test”, “test.txt”) |
| GetDirectoryName() | 返回目录对象:对应Split-Path -parent | GetDirectoryName(“c:\test\file.txt”) |
| GetExtension() | 返回文件扩展名 | GetExtension(“c:\test\file.txt”) |
| GetFileName() | 返回文件名:对应Split-Path -leaf | GetFileName(“c:\test\file.txt”) |
| GetFileNameWithoutExtension() | 返回不带扩展名的文件名 | GetFileNameWithoutExtension(“c:\test\file.txt”) |
| GetFullPath() | 返回绝对路径 | GetFullPath(“.\test.txt”) |
| GetInvalidFileNameChars() | 返回所有不允许出现在文件名中字符 | GetInvalidFileNameChars() |
| GetInvalidPathChars() | 返回所有不允许出现在路径中的字符 | GetInvalidPathChars() |
| GetPathRoot() | 返回根目录:对应Split-Path -qualifier | GetPathRoot(“c:\test\file.txt”) |
| GetRandomFileName() | 返回一个随机的文件名 | GetRandomFileName() |
| GetTempFileName() | 在临时目录中返回一个临时文件名 | GetTempFileName() |
| GetTempPath() | 返回临时文件目录 | GetTempPath() |
| HasExtension() | 如果路径中包含了扩展名,则返回True | HasExtension(“c:\test\file.txt”) |
| IsPathRooted() | 如果是绝对路径,返回为True; Split-Path -isAbsolute | IsPathRooted(“c:\test\file.txt”) |