PowerShell批量处理文本文件:生成新文件避免覆盖原文件
批量处理文本文件并生成带指定后缀的新文件
我是PowerShell完全新手,整理出的单文件处理脚本可以扫描文本文件、清理冗余数据、替换字符并生成新文件,脚本如下:
Get-Content C:\Temp\Tomatoes-2022-09-27.txt | Where-Object { $_.Contains('red') } | # 仅保留包含"red"的行 Foreach-Object { $_ -replace "[/()]", ":" } | # 将/、(、)替换为冒号 Where-Object { -not $_.Contains('too red') } | # 移除包含"too red"的行 Set-Content C:\Temp\Tomatoes-2022-09-27Ripe.txt # 另存为带Ripe后缀的新文件
这个单文件脚本可以正常工作,但批量处理目录内文件时,当前的批量脚本会覆盖原文件,无法生成Tomatoes-[日期]Ripe.txt格式的新文件,现有批量脚本如下:
Get-ChildItem C:\Temp\*.* -Recurse | ForEach-Object { (Get-Content $_) | Where-Object { $_.Contains('red') } | ForEach-Object { $_ -replace "[/()]", ":" } | Where-Object { -not $_.Contains('too red') } | Set-Content $_ }
修改后的批量脚本
无需先复制文件再处理,直接在批量处理时生成新文件名即可。关键是拆分原文件名的结构,拼接出带Ripe后缀的新路径:
Get-ChildItem C:\Temp\*.* -Recurse | ForEach-Object { # 生成新文件名:原主名称+Ripe+原扩展名 $newFilePath = Join-Path -Path $_.DirectoryName -ChildPath "$($_.BaseName)Ripe$($_.Extension)" (Get-Content $_.FullName) | Where-Object { $_.Contains('red') } | ForEach-Object { $_ -replace "[/()]", ":" } | Where-Object { -not $_.Contains('too red') } | Set-Content $newFilePath -Encoding utf8 # 指定编码避免乱码 }
关键说明
$_.BaseName:获取文件的主名称(不含扩展名),比如Tomatoes-2022-09-27$_.Extension:获取文件的扩展名,比如.txtJoin-Path:安全拼接目录和文件名,避免手动拼接路径时出现格式错误Set-Content添加-Encoding utf8:确保输出文件编码统一,防止中文或特殊字符乱码
关于是否需要先复制再处理
不需要额外复制文件再处理。上述脚本直接读取原文件内容,处理后写入新生成的文件,原文件会完整保留,不会被修改。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

