
Ich habe ein Skript zum Komprimieren und Löschen alter Dateien. Das Skript funktioniert in allen anderen Verzeichnissen einwandfrei, aber in einem bestimmten Verzeichnis funktioniert es nicht. Es versucht zwar, es zu komprimieren, erstellt aber am Ende nur eine leere Zip-Datei mit dem Namen Program.7z
. Das lässt mich vermuten, dass die Leerzeichen im Skript nicht richtig maskiert werden. Ich habe in meinen Pfaden doppelte und einfache Anführungszeichen verwendet und die Verkettung der Dateipfade überprüft. Ich habe nicht herausgefunden, was es sein könnte. Irgendwelche Ideen?
Const fileZillaLogs = "C:\Program Files (x86)\Server\Logs"
Const zipProgram = """C:\Program Files\7-Zip\7zG.exe"""
Const zipArgs = "a -mx9"
Dim intZipAge
intZipAge = 7
Dim intDelAge
intDelAge = 90
Call DeleteLogFiles(fileZillaLogs, intZipAge, intDelAge)
Function DeleteLogFiles(strLogPath, intZipAge, intDelAge)
Const bDEBUG = True
Dim objFs
Dim objFolder
Dim objSubFolder
Dim objFile
Dim objWShell
Dim strCommand
Dim iResult
Set objWShell = CreateObject("WScript.Shell")
Set objFs = CreateObject("Scripting.FileSystemObject")
If Right(strLogPath, 1) <> "\" Then
strLogPath = strLogPath & "\"
End If
If objFs.FolderExists(strLogPath) Then
Set objFolder = objFs.GetFolder(strLogPath)
For Each objSubFolder in objFolder.subFolders
DeleteLogFiles strLogPath & objSubFolder.Name, intZipAge, intDelAge
Next
For Each objFile in objFolder.Files
If bDebug Then wscript.echo vbTab & "reviewing file = " & strLogPath & objFile.Name
If DateDiff("d",objFile.DateLastModified,Date) > intDelAge Then
If bDebug Then wscript.echo "Deleting because its old" End If
objFs.DeleteFile(strLogPath & objFile.Name)
Else If DateDiff("d",objFile.DateLastModified,Date) > intZipAge _
And (Right(objFile.Name, 4) = ".log") Then
If bDebug Then wscript.echo vbTab & "zipping file = " & objFile.Path
strCommand = zipProgram & " " & zipArgs & " " & objFile.Path & ".7z" & " " & objFile.Path
iResult = objWShell.Run(strCommand, 0, "false")
If bDebug Then wscript.echo vbTab & "zipping result = " & iResult
If bDebug Then wscript.echo vbTab & "deleting file = " & strLogPath & objFile.Name
objFs.DeleteFile(strLogPath & objFile.Name)
End If
End If
Next
Set objFs = Nothing
Set objFolder = Nothing
Set objWShell = nothing
End If
End Function
Antwort1
Ihr Problem liegt in Zeile 41. IhrobjFile.Pfadenthält Leerzeichen, aber Sie fügen es einem Befehlszeilenargument hinzu. Das bedeutet, dass die Leerzeichen in Anführungszeichen eingeschlossen werden sollten, Sie können jedoch keine Anführungszeichen verwenden, da diese zum Verketten der Zeichenfolge verwendet werden. Sie müssen dann die Anführungszeichen maskieren, die in der Endergebniszeichenfolge enthalten sein sollten. In VBS ist das Escape-Zeichen das doppelte Anführungszeichen. Ihre Zeile 41 sollte also folgendermaßen aussehen:
strCommand = zipProgram & " " & zipArgs & " " & """" & objFile.Path & ".7z" & """" & " " & """" & objFile.Path & """"
Beachten Sie die """"-Sequenzen, die grundsätzlich wie folgt berechnet werden:
- Erstes doppeltes Anführungszeichen: Anfang der Zeichenfolge
- Zweites doppeltes Anführungszeichen: maskiert das nächste Zeichen
- Drittes doppeltes Anführungszeichen: ist das Zeichen, das Sie in Ihrer endgültigen Zeichenfolge haben möchten
- Viertes Anführungszeichen: Ende der Zeichenfolge
Ich habe es ausprobiert und es funktioniert gut. Sie müssen beide Male entkommen, wenn Sie dasobjFile.PfadFunktion.