在 PowerShell 中,您可以实现以下目标:此脚本将按文件名的前17个字符将图片文件分类并移动到相应的文件夹中。如果同一组的图片已存在该文件夹中,则它们会被移动到该文件夹,而不会覆盖已有的文件。

news/2025/1/11 3:18:03/文章来源:https://www.cnblogs.com/suv789/p/18665024

在 PowerShell 中,您可以实现以下目标:

  1. 遍历指定文件夹中的所有图片文件。
  2. 按文件名的前17个字符进行分组。
  3. 创建相应的子文件夹,并将属于同一组的图片移动到该文件夹中。

以下是实现此功能的 PowerShell 脚本:

powershellCopy Code
# 设置目标文件夹路径
$sourceFolder = "C:\path\to\your\images"  # 修改为你的文件夹路径# 获取文件夹中的所有图片文件(可以根据扩展名调整)
$files = Get-ChildItem -Path $sourceFolder -File -Include *.jpg, *.jpeg, *.png, *.gif# 遍历每个文件
foreach ($file in $files) {# 获取文件名的前17个字符$folderName = $file.Name.Substring(0, [Math]::Min(17, $file.Name.Length))# 创建目标子文件夹路径$destinationFolder = Join-Path -Path $sourceFolder -ChildPath $folderName# 如果目标文件夹不存在,则创建它if (-not (Test-Path -Path $destinationFolder)) {New-Item -ItemType Directory -Path $destinationFolder}# 将文件移动到对应的文件夹中$destinationPath = Join-Path -Path $destinationFolder -ChildPath $file.NameMove-Item -Path $file.FullName -Destination $destinationPath
}

说明:

  • $sourceFolder:您需要替换为您的文件夹路径,PowerShell 会在该文件夹中查找所有图片文件。
  • 文件类型:脚本中的 *.jpg*.jpeg*.png*.gif 是图片文件的扩展名,您可以根据需要添加其他类型的文件(如 *.bmp*.tiff 等)。
  • 前17个字符:脚本使用 Substring(0, 17) 提取文件名的前17个字符。如果文件名长度小于17个字符,[Math]::Min(17, $file.Name.Length) 确保不会超出文件名的长度。
  • 文件移动:使用 Move-Item 将图片文件移动到新创建的文件夹中。

执行步骤:

  1. 将脚本中的 C:\path\to\your\images 替换为您的图片所在文件夹路径。
  2. 打开 PowerShell,粘贴并执行脚本。

此脚本将按文件名的前17个字符将图片文件分类并移动到相应的文件夹中。如果同一组的图片已存在该文件夹中,则它们会被移动到该文件夹,而不会覆盖已有的文件。


进一步优化和改进这个 PowerShell 脚本,我们可以做以下几方面的改进:

  1. 批量处理优化:减少 Move-Item 操作时的频繁文件夹检查,以提高效率。
  2. 错误处理:增加文件移动和文件夹创建时的错误处理,确保不会发生意外错误。
  3. 动态扩展名支持:让脚本支持更多图片格式。
  4. 增强用户反馈:添加更多的日志输出,方便跟踪操作过程。

下面是优化后的 PowerShell 脚本:

powershellCopy Code
# 设置目标文件夹路径
$sourceFolder = "C:\path\to\your\images"  # 修改为你的文件夹路径# 获取文件夹中的所有图片文件(可以根据扩展名调整)
$validExtensions = "*.jpg", "*.jpeg", "*.png", "*.gif", "*.bmp", "*.tiff" # 支持更多格式
$files = Get-ChildItem -Path $sourceFolder -File -Include $validExtensions# 记录处理的文件
$processedFiles = 0
$skippedFiles = 0# 创建目标文件夹和移动文件的函数
function CreateAndMoveFile($file) {try {# 获取文件名的前17个字符$folderName = $file.Name.Substring(0, [Math]::Min(17, $file.Name.Length))# 创建目标子文件夹路径$destinationFolder = Join-Path -Path $sourceFolder -ChildPath $folderName# 如果目标文件夹不存在,则创建它if (-not (Test-Path -Path $destinationFolder)) {Write-Host "创建文件夹: $destinationFolder"New-Item -ItemType Directory -Path $destinationFolder | Out-Null}# 移动文件到对应的文件夹$destinationPath = Join-Path -Path $destinationFolder -ChildPath $file.Nameif (-not (Test-Path -Path $destinationPath)) {Move-Item -Path $file.FullName -Destination $destinationPathWrite-Host "移动文件: $($file.Name) 到 $destinationFolder"$global:processedFiles++} else {Write-Host "文件已存在,跳过: $($file.Name)"$global:skippedFiles++}}catch {Write-Host "处理文件 $($file.Name) 时发生错误: $_"}
}# 遍历每个文件
foreach ($file in $files) {CreateAndMoveFile $file
}# 输出最终统计
Write-Host "处理完成: $processedFiles 个文件已移动."
Write-Host "跳过: $skippedFiles 个文件已存在."

优化后的关键点:

  1. 批量处理的性能提升

    • 文件夹创建与文件移动操作被封装为 CreateAndMoveFile 函数,以减少代码重复并提高可读性。
    • 通过检查目标文件夹和目标文件是否存在,避免了不必要的操作(如多次创建文件夹或覆盖文件)。
  2. 错误处理

    • 增加了 try-catch 结构来捕获和报告可能出现的错误。例如,文件权限问题、路径问题等错误将被捕获,并输出详细的错误信息。
  3. 动态扩展名支持

    • 使用 $validExtensions 数组来存储支持的图片扩展名。您可以轻松地向该数组添加更多图片格式(如 *.bmp*.tiff 等)。
  4. 用户反馈与日志

    • 在文件夹创建、文件移动以及跳过的情况下提供日志输出。
    • 统计并报告最终的处理结果:移动的文件数、跳过的文件数等。

执行步骤:

  1. 将脚本中的 C:\path\to\your\images 替换为您的图片所在文件夹路径。
  2. 打开 PowerShell,粘贴并执行脚本。

结果:

  • 脚本会遍历目标文件夹中的所有图片,按文件名的前17个字符创建子文件夹,并将对应的图片文件移动到这些文件夹中。
  • 如果同名文件夹已经存在,则跳过该文件的移动。
  • 输出处理结果,并给出处理的文件数和跳过的文件数。

这种方式使得脚本在处理大量文件时更加高效和灵活,适应更多的文件格式,并且更加易于维护和调试。


进一步优化 PowerShell 脚本的目标是提升其执行效率、增强灵活性、提高可维护性,并且确保更多的错误处理和日志记录。以下是进一步的优化建议:

1. 文件夹与文件移动优化

  • 在大量文件的情况下,减少每次 Move-Item 调用前的路径检查是一个有效的优化。我们可以先通过 Get-ChildItem 获取文件夹列表,避免每次都检查目标文件夹的存在。
  • 如果文件夹存在,我们可以直接跳过 New-Item 操作,避免不必要的开销。

2. 并行处理

  • 如果目标文件夹中的文件数量较大,可以通过 PowerShell 的并行处理来提升性能。使用 ForEach-Object -Parallel 可以加速文件处理,特别是在大批量的文件移动时。

3. 文件冲突处理

  • 如果文件夹已经存在,或者文件名冲突,可以进行版本控制或添加时间戳,以确保不会覆盖文件。

4. 性能监控和日志

  • 通过添加性能监控(比如计算脚本执行时间)和日志文件保存,可以进一步提高脚本的可维护性和用户体验。

优化后的脚本:

powershellCopy Code
# 设置目标文件夹路径
$sourceFolder = "C:\path\to\your\images"  # 修改为你的文件夹路径
$validExtensions = "*.jpg", "*.jpeg", "*.png", "*.gif", "*.bmp", "*.tiff" # 支持更多格式# 获取文件夹中的所有图片文件
$files = Get-ChildItem -Path $sourceFolder -File -Include $validExtensions# 记录处理的文件
$processedFiles = 0
$skippedFiles = 0
$startTime = Get-Date# 创建目标文件夹和移动文件的函数
function CreateAndMoveFile {param ([Parameter(Mandatory=$true)][System.IO.FileInfo] $file)try {# 获取文件名的前17个字符$folderName = $file.Name.Substring(0, [Math]::Min(17, $file.Name.Length))# 创建目标子文件夹路径$destinationFolder = Join-Path -Path $sourceFolder -ChildPath $folderName# 如果目标文件夹不存在,则创建它if (-not (Test-Path -Path $destinationFolder)) {Write-Host "创建文件夹: $destinationFolder"New-Item -ItemType Directory -Path $destinationFolder | Out-Null}# 生成目标文件路径,避免文件名冲突$destinationPath = Join-Path -Path $destinationFolder -ChildPath $file.Nameif (Test-Path -Path $destinationPath) {# 如果文件已经存在,添加时间戳来避免覆盖$timestamp = Get-Date -Format "yyyyMMddHHmmss"$newName = "$($file.BaseName)_$timestamp$($file.Extension)"$destinationPath = Join-Path -Path $destinationFolder -ChildPath $newNameWrite-Host "文件名冲突,重命名为: $newName"}# 移动文件到目标文件夹Move-Item -Path $file.FullName -Destination $destinationPathWrite-Host "移动文件: $($file.Name) 到 $destinationFolder"$global:processedFiles++}catch {Write-Host "处理文件 $($file.Name) 时发生错误: $_"}
}# 并行处理文件(可选)
$files | ForEach-Object -Parallel {param ($file)CreateAndMoveFile -file $file
} -ArgumentList $_# 输出最终统计
$endTime = Get-Date
$executionTime = $endTime - $startTimeWrite-Host "处理完成: $processedFiles 个文件已移动."
Write-Host "跳过: $skippedFiles 个文件已存在."
Write-Host "执行时间: $executionTime"

进一步优化点:

  1. 并行处理

    • 使用 ForEach-Object -Parallel 实现并行处理多个文件。这样可以大幅提高在大量文件时的执行效率。注意,PowerShell 的并行处理在 PowerShell 7.x 及以上版本支持,因此请确保你使用的是支持并行处理的 PowerShell 版本。
  2. 文件冲突处理

    • 如果目标文件夹中已经有相同的文件名,则添加时间戳(基于当前时间)避免覆盖已有文件。这样可以有效避免因同名文件引起的错误。
  3. 性能监控

    • 在脚本开始前记录开始时间,结束后计算并输出脚本执行时间,这样有助于评估优化效果。
  4. 简化代码逻辑

    • 通过将文件夹创建和文件移动操作封装为函数 CreateAndMoveFile,使得代码更简洁且可维护。
  5. 日志输出

    • 增加了详细的 Write-Host 输出,包括文件冲突时的重命名提示和执行过程中的关键日志信息。

执行步骤:

  1. 修改 sourceFolder 为你实际的图片文件夹路径。
  2. 确保 PowerShell 环境版本支持并行处理(PowerShell 7.x 及以上)。
  3. 执行脚本,并查看每个文件的处理情况和最终的执行统计。

性能提升:

  • 使用并行处理可以显著提高在大量文件时的执行速度。
  • 文件夹创建操作仅在需要时执行,减少了不必要的磁盘操作。

这份优化后的脚本在处理大量文件时应具有较好的性能,并能灵活应对文件名冲突和日志记录等需求。如果有更大规模的文件处理需求,您还可以进一步分批处理文件或使用文件队列来实现更加细致的资源管理。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/867524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arcpy环境搭建

背景 在ArcMap和ArcGIS Pro中,都可以使用arcpy,但是代码都要在相应环境中运行才行。 环境选择 1.在软件安装目录中运行arcpy 对于ArcMap中,可以直接在以下目录中运行arcpy代码: C:\Python27\ArcGIS10.4 对于ArcGIS Pro,可以在以下目录运行arcpy代码: C:\Program Files\Ar…

arcpy搭建环境

背景 在ArcMap和ArcGIS Pro中,都可以使用arcpy,但是代码都要在相应环境中运行才行。 环境选择 1.在软件安装目录中运行python 对于ArcMap中,可以直接在以下目录中运行arcpy代码: C:\Python27\ArcGIS10.4 对于ArcGIS Pro,可以在以下目录运行arcpy代码: C:\Program Files\A…

20250110-FortuneWheel 攻击事件:竟然不设滑点,那就体验一下 Force Investment 吧

背景信息 攻击交易:https://app.blocksec.com/explorer/tx/bsc/0xd6ba15ecf3df9aaae37450df8f79233267af41535793ee1f69c565b50e28f7da 漏洞合约:https://vscode.blockscan.com/56/0xc86A50d30c2da607DE91375f363DeDFb3086b9D4 FortuneWheel 合约实现了幸运轮盘竞猜功能,合约…

在Ubuntu 20.04上安装Qt 5.15.0

在Ubuntu 20.04上安装Qt 5.15.01 安装必要的依赖项:sudo apt-get install build-essential \libgl1-mesa-dev \libglu1-mesa-dev \libegl1-mesa-dev \libgles2-mesa-dev \libxrandr-dev \libxext-dev \libxtst-dev \libxrender-dev \libxkbfile-dev \libsqlite3-dev \libssl-…

vscode上配置docker 宝塔环境的xdebug环境,经历过的哪些坑(macbook版)

在macbook中配置vscode对docker中宝塔的php代码进行断点设置的常见排查方式先说配置的几个逻辑: 1. vscode是要通过php debug插件启动9003监听端口 2. docker的宝塔启动xdebug后,是将运行信息推送到vscode宿主的9003端口;这里有个难点,docker内的宝塔和vscode不在一个本地,…

[第五空间2019 决赛]PWN5 1

先checksec一下,发现开启了NX和canary保护看一下ida反汇编,发现输入全都有限制,无法造成造成栈溢出。代码最后会与随机数判断,若相等会执行system。我们看到有printf(buf),这可以造成格式字符串漏洞。 如果我们用格式字符串修改随机数的值,再将输入一样的值就可以执行我…

身份鉴权(PHP)

引子:上一章主要对PHP中全局变量做了介绍,其中```$_COOKIE```、```$_SESSION```常常在身份鉴权中被使用。而本章则是由代码具体聊聊在PHP Web中开发者所常使用的身份鉴权方式。免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!…

UE4.27, 揣摩源码, 网络同步 (三) RPC

6. RPC6.1. RPC是网络同步的一部分,全称Remote Procedure Call。属性同步只能从服务端向客户端单向传递信息,而RPC可以双向传递消息  6.2. 类型6.2.1. Server调用,Actor所属的Client执行    6.2.2. Client调用,Server执行    6.2.3. Server调用,Server和所…

Discharging Method

Firstly, we introduce Euler Formula.When we use Euler formula, we often need its transformations.Secondly, we design some discharging rules based on Euler Formula.Finally, we give the principle of Discharging Method in proofs.

2024.12.16(SpringBoot知识点总结)

4.2 配置文件与配置类的属性映射方式 4.2.1 使用注解@Value映射 我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上 例如: application.properties配置如下: person: name: zhangsan age: 18 1 2 3 或者,application.yml配置如下: person: name: …

2024.12.7(SpringBoot知识点总结)

2.2.2 SpringBoot代码解析 @SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析) SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象 2.2.3 SpringBoot工程热部署 我们在…

python SQLAlchemy ORM——从零开始学习 04 如何过滤(筛选)数据库中的数据

04 如何过滤(筛选)数据库中的数据 从数据库中获筛选数据主要应用以下几个接口:filter、filter_by、以及 where。前两个在 02已经展开说过,先展开说where接口 前情提要:依赖03提及的model【本质上就是数据库的链接,有可忽视】 当前的数据库表内容如下,仅作例子,不相同根…