Vbscript 获得;错误的文件名或编号“;使用目标文件名的变量重命名文件时
我正在尝试循环一个满是.html文件的文件夹,并在文件的开头添加一些代码(尽管在插入代码之前,我得到了一些不需要的换行符),还尝试获取Vbscript 获得;错误的文件名或编号“;使用目标文件名的变量重命名文件时,vbscript,windows-7-x64,Vbscript,Windows 7 X64,我正在尝试循环一个满是.html文件的文件夹,并在文件的开头添加一些代码(尽管在插入代码之前,我得到了一些不需要的换行符),还尝试获取标记的内容,并将其用于重命名每个文件 我正在将空格和不需要的字符替换为- 所有这些都可以,但我也尝试将现有文件(Default0010.html是一个示例)重命名为中的文本 这同样有效,但是当我试图将现有文件移动到新文件时,我会得到一个错误的文件名或编号,但是当我明确地将目标文件名设置为一个简单的字符串时,它会起作用 这让我觉得我的字符串不干净,或者不能使用变量作
标记的内容,并将其用于重命名每个文件
我正在将空格和不需要的字符替换为-
所有这些都可以,但我也尝试将现有文件(Default0010.html
是一个示例)重命名为
中的文本
这同样有效,但是当我试图将现有文件移动到新文件时,我会得到一个错误的文件名或编号
,但是当我明确地将目标文件名设置为一个简单的字符串时,它会起作用
这让我觉得我的字符串不干净,或者不能使用变量作为目标
另外,请忽略行Dim i
,i=i+1
和如果i=1,则退出执行
这是在我测试脚本时添加的,然后当我很高兴它做了我想要的事情时,我会在所有HTML文件上运行它
Set objFso = CreateObject("Scripting.FileSystemObject")
Set Folder = objFSO.GetFolder("C:\My Web Sites\test\www.test.org.uk\html")
Dim i
Dim ObjFsoFile
Dim ObjFile
Dim StrData
Dim StrTitleTag
Dim OldFilename
Dim NewFilename
Set ObjFsoFile = CreateObject("Scripting.FileSystemObject")
'Loop all of the files
For Each File In Folder.Files
'Get contents of the file and store in a string
'Opening the file in READ mode
Set ObjFile = ObjFsoFile.OpenTextFile(File.Name)
'Reading from the file
StrData = ObjFile.ReadAll
'Add the Perch include to the beginning
StrData = replace(StrData,"<?php include('cms/runtime.php');?>","") 'Remove the Perch include in-case we are re-running this
StrData = replace(StrData,"<!DOCTYPE HTML PUBLIC " & Chr(34) & "-//W3C//DTD HTML 4.0 Transitional//EN" & Chr(34) & ">","<?php include('cms/runtime.php');?>" & vbcrlf & "<!DOCTYPE HTML PUBLIC " & Chr(34) & "-//W3C//DTD HTML 4.0 Transitional//EN" & Chr(34) & ">")
'Msgbox StrData
'Closing the file
ObjFile.Close
'Write the changes to the current file
Set objFile = objFSO.CreateTextFile(File.Name,True)
objFile.Write StrData
objFile.Close
'Re-write the contents of the current file and replace with the StrData Above
'Grab the contents between <title> and </title>
parse_string1 = StrData 'see above post
parse_string1 = replace(parse_string1,"<title>","¦")
parse_string = split(parse_string1,"¦")
parse = parse_string(1)
parse_string1 = replace(parse,"</title>","¦")
parse_string = split(parse_string1,"¦")
parsed_string = parse_string(0)
StrTitleTag = parsed_string 'gives final result
'Save old filename of current file to a string
OldFilename = File.Name
'Msgbox OldFilename
'Rename current file to the above contents of between <title> and </title>
'Replace spaces with - characters in the filename.
Dim divider
divider = "-"
'Replace & with and
NewFilename = Replace((StrTitleTag & ".php"),"&","and")
'Replace triple space with single space
NewFilename = Replace(NewFilename," "," ")
'Replace double space with single space
NewFilename = Replace(NewFilename," "," ")
'Replace - with space
NewFilename = Replace(NewFilename," ",divider)
'Replace ---- with -
NewFilename = Replace(NewFilename,divider & "-" & divider,divider)
'Replace ---- with -
NewFilename = Replace(NewFilename,divider & divider & divider,divider)
'Replace ,- with -
NewFilename = Replace(NewFilename,"," & divider,divider)
'Replace LineBreaks with nothing (remove line breaks)
NewFilename = Replace(NewFilename,vbCrLf,"")
NewFilename = Replace(NewFilename,vbLf,"")
NewFilename = Replace(NewFilename,vbCr,"")
NewFilename = LCase(NewFilename)
'Msgbox NewFilename
'Loop through all files
For Each File2 In Folder.Files
'Opening the file in READ mode
Set ObjFile = ObjFsoFile.OpenTextFile(File2.Name)
'Get contents of the file and store in a string
'Reading from the file
StrData = ObjFile.ReadAll
'Closing the file
ObjFile.Close
'Replace all occurences of the old filename with the new filename
StrData = Replace(StrData, OldFilename, NewFilename)
'How to write file
Set objFile = objFSO.CreateTextFile(File2.Name,True)
objFile.Write StrData
objFile.Close
Next
'Rename Old file with the new filename
If objFso.FileExists("C:\My Web Sites\test\www.test.org.uk\html\" & OldFilename) Then
'NewFileName = "test.php"
'NewFileName = "test-test-test-test-test-test-test-test-test.php"
Msgbox "Renaming the file " & OldFilename & " (Length: " & Len(OldFilename) & ") with the following name: " & NewFilename & " (Length: " & Len(NewFilename) & ")"
Msgbox "Compare: test-test-test-test-test-test-test-test-test.php " & NewFilename
objFso.MoveFile "C:\My Web Sites\test\www.test.org.uk\html\" & OldFilename, "C:\My Web Sites\test\www.test.org.uk\html\" & NewFileName
End If
i = i + 1
If i=1 Then Exit For
Next
Set objFso=CreateObject(“Scripting.FileSystemObject”)
Set Folder=objFSO.GetFolder(“C:\mywebsites\test\www.test.org.uk\html”)
昏暗的我
模糊对象轮廓
Dim ObjFile
暗标准数据
暗标
暗淡的旧文件名
暗淡的新文件名
设置ObjFsoFile=CreateObject(“Scripting.FileSystemObject”)
'循环所有文件
对于文件夹.Files中的每个文件
'获取文件内容并以字符串形式存储
'以读取模式打开文件
设置ObjFile=ObjFsoFile.OpenTextFile(File.Name)
'从文件中读取
StrData=ObjFile.ReadAll
'将高位包含添加到开头
StrData=replace(StrData,“,”)'删除Perch include,以防我们重新运行它
StrData=replace(StrData、“”、“”&vbcrlf&“”)
'Msgbox StrData
'关闭文件
ObjFile.Close
'将更改写入当前文件
设置objFile=objFSO.CreateTextFile(File.Name,True)
objFile.Write StrData
objFile.Close
'重新写入当前文件的内容并替换为上面的StrData
“抓取和之间的内容
解析_string1=StrData'见上文
parse_string1=replace(parse_string1,“,”)
parse_string=split(parse_string1,“?”)
parse=parse_字符串(1)
parse_string1=替换(parse,“,”)
parse_string=split(parse_string1,“?”)
已解析字符串=已解析字符串(0)
stritlettag=parsed_string'给出最终结果
'将当前文件的旧文件名保存为字符串
OldFilename=文件名
'Msgbox OldFilename
'将当前文件重命名为介于和之间的上述内容
'将文件名中的空格替换为-个字符。
分光器
分隔符=“-”
'替换为和(&A)'
NewFilename=Replace((stritlettag&“.php”)、“&”、“and”)
'将三重空格替换为单空格
NewFilename=Replace(NewFilename,“,”)
'将双空格替换为单空格
NewFilename=Replace(NewFilename,“,”)
"以空间代替"
NewFilename=Replace(NewFilename,“,分隔符)
“用……代替……”-
NewFilename=Replace(NewFilename,分隔符和“-”分隔符,分隔符)
“用……代替……”-
NewFilename=Replace(NewFilename,分隔符&分隔符&分隔符,分隔符)
'替换,-为-
NewFilename=Replace(NewFilename,“,”和分隔符,分隔符)
'不替换换行符(删除换行符)
NewFilename=Replace(NewFilename,vbCrLf,“”)
NewFilename=Replace(NewFilename,vbLf,“”)
NewFilename=Replace(NewFilename,vbCr,“”)
NewFilename=LCase(NewFilename)
'Msgbox NewFilename
'循环浏览所有文件
对于文件夹.Files中的每个文件2
'以读取模式打开文件
设置ObjFile=ObjFsoFile.OpenTextFile(File2.Name)
'获取文件内容并以字符串形式存储
'从文件中读取
StrData=ObjFile.ReadAll
'关闭文件
ObjFile.Close
'用新文件名替换所有出现的旧文件名
StrData=Replace(StrData、旧文件名、新文件名)
'如何写入文件
设置objFile=objFSO.CreateTextFile(File2.Name,True)
objFile.Write StrData
objFile.Close
下一个
'使用新文件名重命名旧文件
如果objFso.files存在(“C:\My Websites\test\www.test.org.uk\html\”&OldFilename),则
'NewFileName=“test.php”
'NewFileName=“test.php”
Msgbox“重命名文件”&OldFilename&“(长度:&Len(OldFilename)&”)并使用以下名称:&NewFilename&“(长度:&Len(NewFilename)&”)
Msgbox“Compare:test-test-test-test-test-test-test-test.php”&NewFilename
objFso.MoveFile“C:\mywebsites\test\www.test.org.uk\html\”和旧文件名,“C:\mywebsites\test\www.test.org.uk\html\”和新文件名
如果结束
i=i+1
如果i=1,则退出以进行测试
下一个
不要替换已知的错误字符。替换所有非已知良好的字符,例如使用正则表达式:
Set re = New RegExp
re.Pattern = "[^a-z0-9+._-]+"
re.Global = True
re.IgnoreCase = True
NewFilename = re.Replace(OldFilename, "_")
下划线(\u
)通常是这种替换的安全字符
此外,除非必须,否则不要尝试手动解析HTML文件中的元素。在您的情况下,标题提取要容易得多,如下所示:
Set html = CreateObject("HTMLFile")
html.Write objFso.OpenTextFile(File.Name).ReadAll
title = html.Title
它甚至会折叠并为您修剪空白
当您已经拥有文件的句柄时,只需更改文件的Name
属性即可重命名该文件:
objFile.Name = NewFilename
脚本的简化版本(没有修改文件内容的部分):
这看起来很棒,我正在尝试你的建议,一旦我对它们感到满意,我会给你一个漂亮的绿色大勾!但也请注意,我忘了提及我需要循环浏览所有文件并用新文件名替换任何超链接(这将更新网站上指向新页面的任何链接)。我现在获取的对象不支持此属性或方法:代码800A01B6
“重命名”
Set fso = CreateObject("Scripting.FileSystemObject")
htmlFolder = "C:\My Web Sites\test\www.test.org.uk\html"
Set re = New RegExp
re.Pattern = "[^a-z0-9+._-]+"
re.Global = True
re.IgnoreCase = True
For Each f In objFso.GetFolder(htmlFolder).Files
data = f.OpenAsTextStream.ReadAll
Set html = CreateObject("HTMLFile")
html.Write data
oldname = f.Name
newname = re.Replace(f.Name, "_")
f.Name = newname
Next