[VBS] wijzigen foldernaam

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 09:49

Goner

What can I do you for ?

Topicstarter
Ok, 2e poging (zie ook voor reden om script te maken)

De gegoogelde link had ik ook al gevonden en geprobeerd, maar gaf helaas dezelfde foutmelding.
Overigens is niet alles gejat ; het oorspronkelijke script werkt met een array met vaste waarden die gebruikt worden met hernoemen, terwijl ik de naam bijzoek uit meta-bestandjes, maar goed ...

Heb al geprobeerd de subfolder alleen te hernoemen met commando zoals gebruikt in bovenstaand script (<oude naam> = <nwe naam>) en met de syntax die nu in de code zit (MoveFolder), maar die geven allebei een error 'ongeldige bestandsnaam'.

Heb ook een testje gedaan door de waarden uit de variabelen hard to coderen (volledige pathnaam, zoals in veel gevonden voorbeelden wordt getoond) en dat werkt wel, maar met variabelen niet ?!
Dus : objFSO.MoveFolder "C:\FSO\Samples" , "C:\FSO\Scripts"

Quotes om de naam heen en spaties vervangen levert ook niets op ...
Heb een testje ingebakken om te kijken of de te hernoemen folder bestaat en FolderExists werkt wel met een variable foldernaam, maar de uiteindelijk move/rename actie niet : objFSO.MoveFolder strPath1, strPath2


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Option Explicit
Dim folder, subfolders, oFolder, strStartFolder, objNTFS, objFSO, objInStream1, strTextLine1, strName, strPath1, strPath2, lengte1, strFolder, pos1, lengte2, strNew
set objNTFS = Wscript.CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2
strStartFolder = "C:\export_dossiers\20091211142534_71008164\DOS-2007-0006956"
'eerste aanroep sub
RenameSubFolders strStartFolder

Sub RenameSubFolders(strFolder)
    set folder = objNTFS.GetFolder(strFolder)
    set subfolders = folder.SubFolders
    For Each oFolder In subfolders
' naam van te hernoemen folder (objectid)
        strFolder = oFolder.Name
' naam uit metadata
        set objInStream1 = objNTFS.OpenTextFile(oFolder.Path & "\" & strFolder & "_Data.txt", ForReading)
        strTextLine1 = objInStream1.ReadLine
        lengte1 = len(strTextLine1) - 15
        strName = trim(mid(strTextLine1, 16, lengte1))
' evt. spaces in naam vervangen ??
'       strName = replace(strName, " ", "-")
        strPath1 = oFolder.Path
        strPath2 = ofolder.ParentFolder.Path & "\" & strName
' poging met volledig path
        WScript.Echo "Renaming " & strPath1 & " to " & strPath2
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        if objFSO.FolderExists(strPath1) then
           WScript.Echo "folder bestaat!"
           objFSO.MoveFolder strPath1, strPath2
        end if
        set objFSO = Nothing
' poging met alleen subfoldernaam
'       WScript.Echo "Renaming " & oFolder.Name & " to " & strName
'       objNTFS.MoveFolder oFolder.Name , strName

' recursief aanroepen sub         
        RenameSubFolders oFolder.Path
    Next
End Sub

Acties:
  • 0 Henk 'm!

Verwijderd

Als ik het goed bekijk open je een bestand in je te hernoemen folder....
Deze sluit je niet voordat je de folder gaat hernoemen. Dus het bestand is open en is de folder niet te hernoemen.
Neem "objInStream1.Close" (bv nadat je de variabele gezet hebt) op in je script. .

Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 09:49

Goner

What can I do you for ?

Topicstarter
Klopt, bestand met metadata staat in de te hernoemen folder.

Close toegevoegd, maar krijg nog steeds zelfde error ... bedankt in ieder geval, was een mogelijkheid.

code:
1
2
3
        set objInStream1 = objNTFS.OpenTextFile(oFolder.Path & "\" & strFolder & "_Data.txt", ForReading)
        strTextLine1 = objInStream1.ReadLine
        objInStream1.close

Acties:
  • 0 Henk 'm!

  • mhoogendam
  • Registratie: Oktober 2002
  • Laatst online: 13:08
wat gebeurt er als je er een wscript.sleep inzet na het sluiten?
VBScript:
1
wscript.sleep 1000 '1 sec. pause

Ik kan me voorstellen dat de file nog niet dicht is wanneer de folder gerenamed word.
Tevens kan je eens proberen om een tekstfile in een andere directory te zetten, kijken of dat het probleem verhelpt.

Zelf ook wel eens de movefolder commando gebruikt, hier stonden gewoon ook variabele in.
VBScript code blok = [code=vbs] ... [/code]

[ Voor 6% gewijzigd door mhoogendam op 18-12-2009 21:38 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Even een opzetje gemaakt... Probeer eens....

VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Const ForReading = 1

set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
strRoot = "C:\folder1\folder2\rootfolder"

RenameSubFolders strRoot

Sub RenameSubFolders(strRoot)
    set objFolder = objFSO.GetFolder(strRoot)
    set colSubfolders = objFolder.SubFolders

    For Each objSubfolder In colSubfolders
        set objLeesfile = objFSO.OpenTextFile(objSubfolder.Path & "\" & objSubfolder.name & "_Data.txt", ForReading)
            strTextLine1 = objLeesfile.ReadLine
                lengte1 = len(strTextLine1) - 1
                strNaam = trim(mid(strTextLine1, 3, lengte1))
            objLeesfile.Close
        objSubFolder.Name = strNaam
            
        RenameSubFolders objSubfolder.Path
    Next
End Sub

Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 09:49

Goner

What can I do you for ?

Topicstarter
Dat is de methode waarmee ik begonnen ben ; alleen de subfoldernaam gebruiken. Dat werkte niet en toen ben ik verder gegaan met het hele pad en Wscript.CreateObject("Scripting.FileSystemObject") ... dat lukt wel met vaste waarden, maar niet met variabelen.

Ik ga nu eens proberen ik of eerst de hele structuur door kan wandelen en een array (of bestandje) aanmaken met alle oude en nieuwe foldernamen en dan proberen in een apart script te hernoemen.
Wat best dwars zou kunnen zitten - zoals al aangegeven werd - in deze versie is dat het script in een folder 'zit' die hernoemd gaat worden ... (?).

Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 09:49

Goner

What can I do you for ?

Topicstarter
Nog even voor degenen die dit misschien ooit nog 's nodig hebben ...

Fout zat in het halen van de oorspronkelijke naam uit het metadata-bestandje :o
De '15' in regel 18 moet natuurlijk ook '16' zijn, net als in regel 19. De nieuwe naam was dus inderdaad ongeldig, er zat waarschijnlijk een LF of CR aan vastgeplakt. Had nog een echo ingebouwd, maar dat extra teken was niet te zien ...
De methode die het best werkt is deze :
VBScript:
1
oFolder.Name = strName

dus alleen subfoldernaam, niet het hele pad mbv objFSO.MoveFolder.
Het probleem met hele padnaam is dat als je afdaalt in de folderstructuur, de naam van de bovenliggende folder al herschreven is. Je zou dus van onderin moeten beginnen met hernoemen ...

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 12:26

Reptile209

- gers -

Beetje laat, maar nog even een handige debug-tip voor de toekomst om spaties, CRLF's en andere specials makkelijk op te sporen. Gebruik bij het debuggen altijd echo constructies zoals deze:
Visual Basic .NET:
1
WScript.Echo "[" & oFolder.Name & "]"

Als je dan in je output dit ziet:
code:
1
2
[C:\pr0n\
]

in plaats van
code:
1
[C:\pr0n\]

dan weet je meteen waar je de mist in gaat.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 09:49

Goner

What can I do you for ?

Topicstarter
Goeie tip, zal 'm onthouden. Had behoorlijk wat tijd gescheeld ... ik zag het nu pas toen ik de foldernamen naar een tussenbestand schreef om in een 2e script te verwerken. Lege regels ... :o

Liep ook nog aan tegen het gebruik van slashes (/ en \) in de oorspronkelijke foldernamen, wat natuurlijk niet werkt in DOS/Windows.
Oplossing : 'verboden' characters in foldernamen (/\:*?"<>|) vervangen door een streepje met regular expression.
VBScript:
1
2
3
4
Set myRegExp = New RegExp
myRegExp.IgnoreCase = True
myRegExp.Global = True
myRegExp.Pattern = "[/\:*?" & chr(34) & "<>|]"

en aanroepen met :
VBScript:
1
strName = myRegExp.Replace(strName, "-")

[ Voor 11% gewijzigd door Goner op 30-12-2009 15:35 ]


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 12:26

Reptile209

- gers -

Dan nog maar een tip om het af te leren: dubbele aanhalingstekens kan je als volgt in een string gebruiken:
Visual Basic .NET:
1
myRegExp.Pattern = "[/\:*?""<>|]"

de "" wordt door VB geparsed naar één ". Als je er twee achter elkaar zou willen hebben, krijg je dus """" (4x "), in stringvorm: dubbelQuote = """""". Niet echt leesbaar, maar dat is chr(34) ook niet ;)

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • Goner
  • Registratie: Mei 2002
  • Laatst online: 09:49

Goner

What can I do you for ?

Topicstarter
En nog een leermoment ; ik merk net bij testen dat ook de back-slash (\) er dubbel in moet ... anders wordt die niet vervangen.
VBScript:
1
myRegExp.Pattern = "[/\\:*?""<>|]"
Pagina: 1