Board logo

标题: [问题求助] 求教两个字符串之间内容命名文件名 [打印本页]

作者: jieyuan_1981    时间: 2019-3-9 15:42     标题: 求教两个字符串之间内容命名文件名

我有一堆.html文件都是以数字命名,但不规则。我要以里面<title>...</title>的内容为html文件名,若用bat写经常出现响应错误,里面东西都没了。还有用vbs的话replace不支持通配符,该咋弄。
作者: ivor    时间: 2019-3-9 16:40

本帖最后由 ivor 于 2019-3-9 21:06 编辑
  1. @Powershell "& {[ScriptBlock]::Create("'#' + (gc '%~f0' -raw)").Invoke()}" & pause & goto :eof
  2. dir *.html | %{ren $_.Name ([regex]::Replace(([regex]::Match((gc $_),'(?<=<title>).*(?=</title>)').Value),'[\\/:*?\"<>|]',"")+$_.Extension)}
复制代码
已经过滤了特殊字符
作者: jieyuan_1981    时间: 2019-3-9 16:56

我试了,提示无效字符。
作者: yhcfsr    时间: 2019-3-9 17:05

  1. @echo off
  2. powershell -nologo -noprofile -command "foreach( $file in ( dir *.html -r ) ){([regex] '<title>(.*)</title>').Match( (type $file -ReadCount 0)).Groups[1]|foreach-object{ren -Path $file -NewName  \"$($_.Value).html\"}}"
复制代码

作者: jieyuan_1981    时间: 2019-3-9 20:39

本帖最后由 jieyuan_1981 于 2019-3-9 22:22 编辑

回复 4# yhcfsr


    谢谢你的回答,但提示语句未结束。
作者: ivor    时间: 2019-3-9 21:35

已经过滤了特殊字符
作者: jieyuan_1981    时间: 2019-3-9 21:55

回复 6# ivor
作者: jieyuan_1981    时间: 2019-3-9 22:07

本帖最后由 jieyuan_1981 于 2019-3-9 22:16 编辑

回复 2# ivor


    我在本论坛看了几篇无效字符的帖子,好像是关键字或赋值方法的问题,还有是vba代码不能用在vbs中。比如:open Filename 就不行,open就行。你给我的答案是不是这块有问题。另外我是xp系统,是否不识别。
作者: ivor    时间: 2019-3-9 22:17

我们给的都是批处理代码,你放到vbs里面肯定不能运行了
加我qq250193966,帮你看看
作者: 523066680    时间: 2019-3-9 22:41

本帖最后由 523066680 于 2019-3-9 22:44 编辑

即使是XP,涉及HTML解析的问题仍然建议换别的语言工具(lua, python, ahk, 什么都好,lua还能转exe呢)。
提取 <title> 示例
  1. use Mojo::DOM;
  2. use File::Slurp;
  3. grep { printf "%s %s\n", $_, Mojo::DOM->new(read_file $_)->at("title")->text } glob "*.html";
复制代码

作者: zaqmlp    时间: 2019-3-10 00:32

  1. '代码可用,扫码头像,随意赞助;有什么问题,可加QQ956535081及时沟通
  2. If LCase(Right(WSH.FullName,12)) = "\wscript.exe" Then
  3.     CreateObject("WScript.Shell").Run "cmd /c cscript.exe -nologo """ & WSH.ScriptFullName & """&pause&exit"
  4.     WSH.Quit
  5. End If
  6. Set fso=CreateObject("Scripting.FileSystemObject")
  7. RootPath=fso.GetFile(WSH.ScriptFullName).ParentFolder.Path
  8. arr=split("\ / : * ? \ "" < > | " & Chr(9)," ")
  9. getfile RootPath
  10. Function getfile(path)
  11.     Set oFolder=fso.GetFolder(path)
  12.     Set oSubFolders=oFolder.SubFolders
  13.       
  14.     Set oFiles=oFolder.Files
  15.     For Each oFile In oFiles
  16.         ext=fso.GetExtensionName(oFile.Path)
  17.         If Lcase(ext) = "html" Or Lcase(ext) = "htm" Then
  18.             text=gethtml(oFile.Path)
  19.             title=gettitle(text)
  20.             NewName=title & "." & ext
  21.             WSH.echo oFile.Path & " --> " & NewName
  22.             If title <> "" Then
  23.                 If Not fso.FileExists(oFile.ParentFolder.Path & "\" & NewName) Then
  24.                     oFile.Name=NewName
  25.                 Else
  26.                     WSH.echo "文件重名"
  27.                 End If
  28.             End If
  29.         End If
  30.     Next
  31.       
  32.     For Each oSubFolder In oSubFolders
  33.         getfile(oSubFolder.Path)
  34.     Next
  35.     Set oFolder=Nothing
  36.     Set oSubFolders=Nothing
  37. End Function
  38. Function gethtml(ByVal htmlfile)
  39.     htmltext=""
  40.     Set ado=CreateObject("ADODB.Stream")
  41.     ado.Type=2
  42.     '注意html文件的编码,如果是gbk或gb2312,修改下面的"utf-8"为"gb2312"
  43.     ado.Charset="utf-8"
  44.     ado.Open
  45.     ado.LoadFromFile htmlfile
  46.     ado.Position=0
  47.     htmltext=ado.ReadText
  48.     ado.Close
  49.     Set ado=Nothing
  50.     gethtml=htmltext
  51. End Function
  52. Function gettitle(ByVal htmltext)
  53.     htmltitle=""
  54.     Set regex=New RegExp
  55.     regex.Pattern="<title>(.+?)<\/title>"
  56.     regex.IgnoreCase=True
  57.     regex.Global = True
  58.     Set matches=regex.Execute(htmltext)
  59.     If matches.Count = 1 Then
  60.         htmltitle=matches(0).SubMatches(0)
  61.         For i=0 To Ubound(arr)
  62.             htmltitle=replace(htmltitle,arr(i),"_")
  63.         Next
  64.     End If
  65.     Set regex=Nothing
  66.     gettitle=htmltitle
  67. End Function
复制代码

作者: jieyuan_1981    时间: 2019-3-10 09:21

回复 11# zaqmlp


    谢谢你的是正确答案,但确实编码要改我的是ansi。
作者: xp3000    时间: 2019-9-28 20:11

以前VBS能运行,后来有部分不能了,不知道怎么回事




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2