Bootstrap

PowerShell常用操作

参考资料

  1. PowerShell快速修改多个文件的名称
  2. (PowerShell) 重命名文件


零. 前提

0.1 打开PowerShell窗口

⏹按住Shift后,单击鼠标右键,即可打开PowerShell窗口

在这里插入图片描述
⏹快捷键 Win + X还可以通过管理员模式打开PowerShell窗口

在这里插入图片描述
⏹在Windows的开始菜单的应用中也可以找到

在这里插入图片描述

0.2 创建Powershell

⏹如果只是复制粘贴别人写好的Powershell,创建一个文本文件,粘贴完内容后
不能直接保存,而是应该另存为,然后指定编码为带有 BOM 的 UTF-8
否则脚本运行的时候会报乱码错误。

⏹指定为编码后,将文件后缀由.txt改为.ps1即可运行。

在这里插入图片描述

💥如果我们指定编码为带有 BOM 的 UTF-8的话,通过Windows自带的IDE也可以看到,脚本内容是乱码的。

在这里插入图片描述

🧐当指定编码为带有 BOM 的 UTF-8,通过Windows自带的IDE可以看到,脚本内容不乱码,正常显示。
在这里插入图片描述

0.3 运行PowerShell

⏹PowerShell脚本的后缀是.ps1,选中脚本,然后使用PowerShell运行,即可执行脚本
在这里插入图片描述

⏹还可以选择打开后,使用Windows自带的IDE编辑并运行调试PowerShell脚本

在这里插入图片描述


一. 文件夹操作

1.1 批量创建编号文件夹

  • 在当前目录下,创建以新建文件夹开头的10个文件夹
mkdir (
    1..10 | %{"新建文件夹$_"}
)

1.2 批量创建指定的文件夹

  • 创建多级目录,使用-p参数,多级目录间用斜杠分隔
mkdir -p 一级目录/二级目录/三级目录
  • 创建多个同级文件夹
mkdir -p 同级目录1,同级目录2,同级目录3

1.3 获取当前文件夹下所有的文件夹名

  • -dir:表示仅获取文件夹名,而不是文件名
  • -r:表示递归
# 获取全路径文件夹名称
Get-ChildItem -dir | ForEach-Object {$_.FullName}
# 递归获取全路径文件夹名称
Get-ChildItem -dir -r | ForEach-Object {$_.FullName}
# 不获取路径,仅获取文件夹名称
Get-ChildItem -dir | ForEach-Object {$_.Name}

二. 文件操作

2.1 批量创建文本文件

1..5 | ForEach-Object {
	# 指定要创建的文件格式
    $fileName = "数据文件_$_.csv"
    # 创建文件
    New-Item -Path $fileName -ItemType File
}

2.2 获取指定文件夹下的文件名

  • Write-Hostecho:将文本打印在控制台上
  • $host.UI.RawUI.ReadKey():用于从用户输入获取单个按键信息的命令。
    • 会暂停脚本的执行,直到用户按下一个键并返回有关按键的信息。
    • 只能用于直接运行ps1文件,如果使用IDE调试的话,会提示报错。
  • 在powershell中使用反引号`来换行
  • -Recurse 表示递归获取,还可简写为 -r
  • -File 表示获取的是文件,而不是文件夹
  • -Filter *.mp3 表示过滤出mp3文件
  • $_.FULLNAME 表示获取文件的全路径
  • $_.NAME 表示仅获取名称
  • $HOME表示当前登录用户的目录文件夹
# 设置要扫描的文件夹路径
$folderPath = "E:\mp3"

<#
    构建输出文件的完整路径,将结果输出到桌面上的all_file_name.txt文件中
    $HOME表示当前电脑登录用户所在的目录
#> 
$outputFilePath = "$HOME\Desktop\all_file_name.txt"
# _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

<#
    获取文件夹下所有文件的名称
        1. 在powershell中使用反引号`来换行
        2. -Recurse 表示递归获取,还可简写为 -r
        3. -File 表示获取的是文件,而不是文件夹
        4. -Filter *.mp3 表示过滤出mp3文件
        5. $_.FULLNAME  表示获取文件的全路径
        6. $_.NAME 表示仅获取名称
#> 
$fileNames = Get-ChildItem -Path $folderPath -Recurse -File -Filter *.mp3 `
| ForEach-Object {$_.FULLNAME}

# 输出每个文件名到文件,并指定格式为UTF-8
$fileNames | Out-File -FilePath $outputFilePath -Encoding UTF8

# _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

# 将指定文本打印在控制台上
Write-Host "脚本执行完毕。获取到的文件名称如下:"
echo "=========================="
# 将获取到的文件名称打印在控制台上
$fileNames | ForEach-Object {echo $_}
echo "=========================="
echo "按任意键关闭窗口。"

# 暂停脚本执行
$host.UI.RawUI.ReadKey()

2.3 重命名

2.3.1 单文件重命名

  • 通过rename-Item即可实现
rename-Item 'D:\TEST\old_name.txt' -NewName '新文件名.txt'  

2.3.2 批量重命名

⏹Powershell版本

  • $PWD:表示当前路径
  • $_.Extension:获取后缀名
# 定义一个计数变量i
$i = 0

# $PWD 表示当前路径
Get-ChildItem -Path $PWD -Filter *.jpg |
ForEach-Object {
	# 构建新的文件名
    $newName = 'pic_{0:d6}{1}' -f $i++, $_.Extension
    # 对每一个文件进行重命名
    Rename-Item -Path $_.FullName -NewName $newName
}

⏹bat版本,创建文本文件,后缀改为.bat,双击运行即可。

@echo off
setlocal enabledelayedexpansion
set var=0  
echo %var%
set /a i = i + var
for  %%x in (*) do (
    if not "%%x"=="rename.bat" (
        set /a i+=1    
        rename "%%x" "picture-!i!.jpg"     
    )
)
pause

2.3.3 文件名添加前缀

get-childItem *.txt | rename-Item -newname {'前缀_' + $_.name} 

2.3.4 文件名修改后缀名

  • 因为-replace的模式匹配字符串参数支持正则表达式,因此.txt要转义为\.txt
Get-ChildItem *.txt | Rename-Item -newname { $_.name -replace '\.txt','.html' }  
;