标题: [问题求助] 求教两个字符串之间内容命名文件名 [打印本页]
作者: 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 编辑
- @Powershell "& {[ScriptBlock]::Create("'#' + (gc '%~f0' -raw)").Invoke()}" & pause & goto :eof
- 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
- @echo off
- 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> 示例- use Mojo::DOM;
- use File::Slurp;
- grep { printf "%s %s\n", $_, Mojo::DOM->new(read_file $_)->at("title")->text } glob "*.html";
复制代码
作者: zaqmlp 时间: 2019-3-10 00:32
- '代码可用,扫码头像,随意赞助;有什么问题,可加QQ956535081及时沟通
- If LCase(Right(WSH.FullName,12)) = "\wscript.exe" Then
- CreateObject("WScript.Shell").Run "cmd /c cscript.exe -nologo """ & WSH.ScriptFullName & """&pause&exit"
- WSH.Quit
- End If
-
- Set fso=CreateObject("Scripting.FileSystemObject")
- RootPath=fso.GetFile(WSH.ScriptFullName).ParentFolder.Path
- arr=split("\ / : * ? \ "" < > | " & Chr(9)," ")
- getfile RootPath
-
- Function getfile(path)
- Set oFolder=fso.GetFolder(path)
- Set oSubFolders=oFolder.SubFolders
-
- Set oFiles=oFolder.Files
- For Each oFile In oFiles
- ext=fso.GetExtensionName(oFile.Path)
- If Lcase(ext) = "html" Or Lcase(ext) = "htm" Then
- text=gethtml(oFile.Path)
- title=gettitle(text)
- NewName=title & "." & ext
- WSH.echo oFile.Path & " --> " & NewName
- If title <> "" Then
- If Not fso.FileExists(oFile.ParentFolder.Path & "\" & NewName) Then
- oFile.Name=NewName
- Else
- WSH.echo "文件重名"
- End If
- End If
- End If
- Next
-
- For Each oSubFolder In oSubFolders
- getfile(oSubFolder.Path)
- Next
- Set oFolder=Nothing
- Set oSubFolders=Nothing
- End Function
-
- Function gethtml(ByVal htmlfile)
- htmltext=""
- Set ado=CreateObject("ADODB.Stream")
- ado.Type=2
- '注意html文件的编码,如果是gbk或gb2312,修改下面的"utf-8"为"gb2312"
- ado.Charset="utf-8"
- ado.Open
- ado.LoadFromFile htmlfile
- ado.Position=0
- htmltext=ado.ReadText
- ado.Close
- Set ado=Nothing
- gethtml=htmltext
- End Function
-
- Function gettitle(ByVal htmltext)
- htmltitle=""
- Set regex=New RegExp
- regex.Pattern="<title>(.+?)<\/title>"
- regex.IgnoreCase=True
- regex.Global = True
- Set matches=regex.Execute(htmltext)
- If matches.Count = 1 Then
- htmltitle=matches(0).SubMatches(0)
- For i=0 To Ubound(arr)
- htmltitle=replace(htmltitle,arr(i),"_")
- Next
- End If
- Set regex=Nothing
- gettitle=htmltitle
- 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 |