找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 51|回复: 7

[文本处理] [已解决]将所有文件夹下的txt文件正文里带书名号的文字提取出来作为后缀加到文件夹名

[复制链接]
发表于 昨天 15:37 | 显示全部楼层 |阅读模式
本帖最后由 crownking1983 于 2026-10-18 02:25 编辑

求将所有文件夹下的txt文件正文里带书名号的文字提取出来,作为后缀重命名加到每一个文件夹名后面。实例如下:

一堆文件夹

2026-10-17 国内电影      这个文件夹下有一个名为001.txt文件,文件打开正文是 :“影评:《给阿嫲的情书》,这个电影………………”
2026-10-18 国内电影      这个文件夹下有一个名为yp.txt文件,文件打开正文是 :“影评:《我的父辈》《我和我的祖国》,这两个电影………………”
2026-10-19 国内电影      这个文件夹下有一个名为abcsd.txt文件,文件打开正文是 :“影评:《你好,李焕英》,这个电影………………”
2026-10-20 国内电影      这个文件夹下有一个名为jjtaa.txt文件,文件打开正文是 :“影评:《人在囧途》《泰囧》《港囧》,徐峥囧途三部曲,这三个电影………………”
2026-10-21 国内电影      这个文件夹下有一个名为myheq.txt文件,文件打开正文是 :“影评:《我不是药神》《孤注一掷》,王传君的神作,这写电影………………”

有多个txt文件的每一个txt文件里只要包含《》就都提取。
批处理运行后,所有的文件夹均以txt正文中包含《》的文字作为后缀重命名文件夹,如果《》中的文字包含重命名文件夹时不支持的字符,如《你好,李焕英》中的逗号不能作为重命名文件夹使用,则用下划线_替代。如果硬txt文档中有多个《》,则用空格隔开。

以上内容处理后 文件夹名分别变为

2026-10-17 国内电影 给阿嫲的情书
2026-10-18 国内电影 我的父辈 我和我的祖国
2026-10-19 国内电影 你好_李焕英
2026-10-20 国内电影 人在囧途 泰囧 港囧
2026-10-21 国内电影 我不是药神 孤注一掷

添加后缀时,原文件名末尾增加一个空格,与后缀之间有个空格以免与原文件夹连在一起。

跪求大神帮忙,好人一生平安
发表于 昨天 18:41 | 显示全部楼层
AI:

重命名.bat
  1. <# :
  2. cls&echo off&cd /d "%~dp0"
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
  4. pause
  5. exit
  6. #>

  7. $root = (Get-Location).Path

  8. function Read-Txt($path) {
  9.     $b = [IO.File]::ReadAllBytes($path)

  10.     if ($b.Length -ge 2 -and $b[0] -eq 255 -and $b[1] -eq 254) {
  11.         return [Text.Encoding]::Unicode.GetString($b, 2, $b.Length - 2)
  12.     }
  13.     if ($b.Length -ge 2 -and $b[0] -eq 254 -and $b[1] -eq 255) {
  14.         return [Text.Encoding]::BigEndianUnicode.GetString($b, 2, $b.Length - 2)
  15.     }

  16.     $utf8 = New-Object System.Text.UTF8Encoding -ArgumentList $false, $true
  17.     try {
  18.         return $utf8.GetString($b)
  19.     }
  20.     catch {
  21.         return [Text.Encoding]::GetEncoding(936).GetString($b)
  22.     }
  23. }

  24. $dirs = Get-ChildItem -LiteralPath $root -Recurse |
  25.     Where-Object { $_.PSIsContainer } |
  26.     Sort-Object { $_.FullName.Length } -Descending

  27. foreach ($dir in $dirs) {
  28.     $names = New-Object System.Collections.ArrayList
  29.     $seen = @{}

  30.     $files = Get-ChildItem -LiteralPath $dir.FullName -Filter '*.txt' |
  31.         Where-Object { -not $_.PSIsContainer } |
  32.         Sort-Object Name

  33.     foreach ($file in $files) {
  34.         try {
  35.             $content = Read-Txt $file.FullName
  36.         }
  37.         catch {
  38.             Write-Warning "Cannot read: $($file.FullName)"
  39.             continue
  40.         }

  41.         foreach ($m in [regex]::Matches($content, '《([^《》\r\n]+)》')) {
  42.             $name = [regex]::Replace(
  43.                 $m.Groups[1].Value,
  44.                 '[\\/:*?"<>|,,\x00-\x1F]',
  45.                 '_'
  46.             ).Trim().TrimEnd('.')

  47.             if ($name -ne '' -and -not $seen.ContainsKey($name)) {
  48.                 $seen[$name] = $true
  49.                 [void]$names.Add($name)
  50.             }
  51.         }
  52.     }

  53.     if ($names.Count -eq 0) { continue }

  54.     $suffix = [string]::Join(' ', [string[]]$names.ToArray())

  55.     if ($dir.Name.EndsWith(' ' + $suffix, [StringComparison]::OrdinalIgnoreCase)) {
  56.         continue
  57.     }

  58.     $newName = $dir.Name + ' ' + $suffix

  59.     try {
  60.         Rename-Item -LiteralPath $dir.FullName -NewName $newName -ErrorAction Stop
  61.         Write-Host "$($dir.Name) => $newName"
  62.     }
  63.     catch {
  64.         Write-Warning "Rename failed: $($dir.FullName) : $_"
  65.     }
  66. }
复制代码

评分

参与人数 1技术 +1 收起 理由
crownking1983 + 1 乐于助人

查看全部评分

 楼主| 发表于 昨天 19:07 | 显示全部楼层

你好大神 运行后提示错误内容如下
 楼主| 发表于 昨天 19:07 | 显示全部楼层


你好大神 运行后提示错误内容如下

nvoke-Expression : 所在位置 行:53 字符: 19                                                                             
+                 '[\\/:*?"<>|,锛孿x00-\x1F]',                                                                          
+                   ~                                                                                                   
数组索引表达式丢失或无效。                                                                                             
所在位置 行:53 字符: 19                                                                                                
+                 '[\\/:*?"<>|,锛孿x00-\x1F]',                                                                          
+                   ~                                                                                                   
方法调用中缺少“)”。                                                                                                   
所在位置 行:53 字符: 19                                                                                                
+                 '[\\/:*?"<>|,锛孿x00-\x1F]',                                                                          
+                   ~~~~~~~~~~~~~~~~~~~~~~~~                                                                           
表达式或语句中包含意外的标记“\\/:*?"<>|,锛孿x00-\x1F]',                                                               
                '_'                                                                                                     
            ).Trim().TrimEnd('.')                                                                                       
            if ($name -ne '' -and -not $seen.ContainsKey($name)) {                                                      
                $seen[$name] = $true                                                                                    
                [void]$names.Add($name)                                                                                 
            }                                                                                                           
        }                                                                                                               
    }                                                                                                                  
    if ($names.Count -eq 0) { continue }                                                                                
    $suffix = [string]::Join(' ', [string[]]$names.ToArray())                                                           
    if ($dir.Name.EndsWith(' ' + $suffix, [StringComparison]::OrdinalIgnoreCase)) {                                    
        continue                                                                                                        
    }                                                                                                                  
    $newName = $dir.Name + ' ' + $suffix                                                                                
    try {                                                                                                               
        Rename-Item -LiteralPath $dir.FullName -NewName $newName -ErrorAction Stop                                      
        Write-Host "$($dir.Name)”。                                                                                    
所在位置 行:53 字符: 19                                                                                                
+                 '[\\/:*?"<>|,锛孿x00-\x1F]',                                                                          
+                   ~                                                                                                   
foreach 循环的表达式部分后面缺少右“)”。                                                                              
所在位置 行:79 字符: 60                                                                                                
+         Write-Warning "Rename failed: $($dir.FullName) : $_"                                                         
+                                                            ~                                                         
字符串缺少终止符: "。                                                                                                   
所在位置 行:41 字符: 31                                                                                                
+     foreach ($file in $files) {                                                                                       
+                               ~                                                                                       
语句块或类型定义中缺少右“}”。                                                                                         
所在位置 行:33 字符: 25                                                                                                
+ foreach ($dir in $dirs) {                                                                                             
+                         ~                                                                                             
语句块或类型定义中缺少右“}”。                                                                                         
所在位置 行:1 字符: 59                                                                                                  
+ ... ntent -literal 'C:\360极速浏览器X下载\1\修改.bat'|Out-String|Invoke-Expression                                    
+                                                         ~~~~~~~~~~~~~~~~~                                             
    + CategoryInfo          : ParserError: ( [Invoke-Expression], ParseException                                      
    + FullyQualifiedErrorId : MissingArrayIndexExpression,Microsoft.PowerShell.Commands.InvokeExpressionCommand  
发表于 昨天 20:52 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-10-18 00:36 编辑

试试以下代码,代码第2行假设主目录是 c:\360极速浏览器X下载 可自定义,另假定被处理的 *.txt 文件编码均为简中编码(ansi 或 gb2312)...

test.bat
  1. <# ::
  2. @echo off &setlocal &set "td=c:\360极速浏览器X下载"
  3. cd /d "%td%" &powershell -nop -c "iex(${%~f0}|out-string)" &exit/b
  4. #>
  5. dir -dir -r|sort fullname -desc|%{
  6.   $g=1; $d=$_.fullname; $nf=$_.name; dir $d -file *.txt|%{
  7.     if ($g) {
  8.       $sv=([regex]::matches((gc $_.fullname -raw), '《([^》]+)》') | % { $_.groups[1].value }) -join ' '
  9.       if ($sv) { ren $d "$nf $sv"; $g=$null } } } }
  10. exit
复制代码

评分

参与人数 1技术 +1 收起 理由
crownking1983 + 1 乐于助人

查看全部评分

发表于 昨天 20:56 | 显示全部楼层
crownking1983 发表于 2026-10-17 19:07
你好大神 运行后提示错误内容如下

nvoke-Expression : 所在位置 行:53 字符: 19                        ...

脚本保存为ANSI编码试试。
 楼主| 发表于 3 小时前 | 显示全部楼层
77七 发表于 2026-10-17 20:56
脚本保存为ANSI编码试试。

太牛逼了!竟然还有去重功能!!神了!
 楼主| 发表于 3 小时前 | 显示全部楼层
aloha20200628 发表于 2026-10-17 20:52
试试以下代码,代码第2行假设主目录是 c:\360极速浏览器X下载 可自定义,另假定被处理的 *.txt 文件编码均 ...

牛逼啊 你的代码简短的多,而且经常帮助我,非常的感谢啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-10-18 06:11

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表