2013-06-25 4 views
2

Je suis en train de boucler un dossier rempli de fichiers .html et d'ajouter du code au début des fichiers (bien que j'obtiens une ligne non désirée interruptions avant le code que j'insère) et aussi pour saisir le contenu de la balise <title> et l'utiliser pour renommer chaque fichier.Obtention du nom ou du numéro de fichier incorrect lors de la modification du nom du fichier de destination

Je remplace les espaces et les caractères indésirables avec -Bois

Tout cela fonctionne, mais je tente aussi de renommer le fichier existant (Default0010.html est un exemple) au texte de la <title>.

Cela fonctionne aussi mais quand j'essaie de déplacer le fichier existant dans le nouveau fichier, j'obtiens un Bad File name or Number mais quand j'explique explicitement le nom du fichier de destination à une chaîne simple cela fonctionne.

Cela me fait penser que ma chaîne n'est pas propre ou que vous ne pouvez pas utiliser une variable pour la destination. Veuillez également ignorer les lignes Dim i, i = i + 1 et If i=1 Then Exit For.

Ceci a été ajouté pendant que je testais le script puis quand j'étais content qu'il fasse ce que je voulais, je le courrais sur tous les fichiers 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 

Répondre

1

Ne remplacez pas mauvais caractères connus. Remplacer tout ce qui est pas un bien connu caractère, par ex. en utilisant une expression régulière:

Set re = New RegExp 
re.Pattern = "[^a-z0-9+._-]+" 
re.Global = True 
re.IgnoreCase = True 

NewFilename = re.Replace(OldFilename, "_") 

Le trait de soulignement (_) est généralement un caractère sûr pour ce genre de remplacement. De même, n'essayez pas d'analyser manuellement les éléments d'un fichier HTML à moins d'y être obligé. Dans votre cas, le titre peut être extrait beaucoup plus facile, comme ceci:

Set html = CreateObject("HTMLFile") 
html.Write objFso.OpenTextFile(File.Name).ReadAll 
title = html.Title 

Il va même jusqu'à l'effondrement et suppression des espaces pour vous.

Et un fichier peut être renommé en changeant simplement sa propriété Name lorsque vous avez déjà une poignée à ce fichier:

objFile.Name = NewFilename 

Version simplifiée de votre script (sans les parties qui modifient le contenu des fichiers) :

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 
+0

Cela semble très bien et j'essaie vos suggestions maintenant, une fois que je suis heureux avec eux, je vais vous donner une belle grosse coche verte! Mais aussi s'il vous plaît noter que j'ai oublié de mentionner que je dois parcourir tout le fichier et remplacer les liens hypertexte avec le nouveaufichier (cela mettra à jour tous les liens sur le site à la nouvelle page) –

+0

Je reçois maintenant l'objet ne supporte pas cette propriété ou méthode: Code 800A01B6 ''Renommer l'ancien fichier avec le nouveau nom de fichier' ' Si objFso.FileExists ("C: \ Mes sites Web \ Dodderhill \ www.dodderhillhistory.org.uk \ html \" & OldFilename) Then' ' Set objFile = ObjFsoFile.OpenTextFile (File.Name) '' objFile.Name = NewFilename' ' 'Fermeture du fichier' ' 'ObjFile.Close' Fin If' –

+0

Vous avez' objFile' un [flux de texte] (http://msdn.microsoft.objet com/en-us/library/312a5kbt), pas un objet [File] (http://msdn.microsoft.com/en-us/library/1ft05taf). Seuls les derniers ont une propriété 'Name'. Et il a déjà été noté que vous mettez à jour les liens dans vos fichiers. Donc, ma remarque que le code simplifié n'incluait pas ces parties (IOW, vous auriez besoin de les ajouter à nouveau). Ils ont été omis de l'exemple de code pour garder l'exemple simple. –

Questions connexes