WshShell.Run Problemchen
Guten Tag zusammen,
ich bin hier zwar nicht regelmäßig Gast, habe aber trotzdem ein kleines Problem
bei dem mir jemand behilflich sein sollte:
Nachfolgender vb-script soll in der Windows Erweiterung "ClassicExplorer" zum Einsatz kommen.
Ich muss diesen Umweg via vb-script leider nehmen weil ein direktes Ansprechen mit den entspr.
Parametern für SDelete.exe (bzw SDelete64.exe), wie im Script angegeben, im ClassicExplorer
leider so nicht möglich ist.
Problem macht aber der Befehl WshShell.Run
Zweck ist lediglich der, einen vb-script zu schreiben der via Drag&Drop den enspr. File bzw. das entspr.
Directory löscht.
Klappt leider nicht. Der Aufruf von SDelete erfolgt zwar aber es wird nichts gelöscht.
Wo steckt der Wurm drin?
Herzlichen Dank im Voraus
Werner
ich bin hier zwar nicht regelmäßig Gast, habe aber trotzdem ein kleines Problem
bei dem mir jemand behilflich sein sollte:
Nachfolgender vb-script soll in der Windows Erweiterung "ClassicExplorer" zum Einsatz kommen.
Ich muss diesen Umweg via vb-script leider nehmen weil ein direktes Ansprechen mit den entspr.
Parametern für SDelete.exe (bzw SDelete64.exe), wie im Script angegeben, im ClassicExplorer
leider so nicht möglich ist.
Problem macht aber der Befehl WshShell.Run
Zweck ist lediglich der, einen vb-script zu schreiben der via Drag&Drop den enspr. File bzw. das entspr.
Directory löscht.
Klappt leider nicht. Der Aufruf von SDelete erfolgt zwar aber es wird nichts gelöscht.
Wo steckt der Wurm drin?
Set objArgs = WScript.Arguments
Set WshShell = WScript.CreateObject("WScript.Shell")
On Error Resume Next
'Debugging
For Each strArg in objArgs
WScript.Echo strArg
Next
dim Frage
Frage=msgbox("Angewähltes Objekt soll gelöscht werden",+vbyesno,"")
if Frage=vbyes then
WshShell.Run "sdelete64.exe -p 3 -s -q" & " " & strArg
end if
Herzlichen Dank im Voraus
Werner
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 323602
Url: https://administrator.de/forum/wshshell-run-problemchen-323602.html
Ausgedruckt am: 21.04.2025 um 13:04 Uhr
5 Kommentare
Neuester Kommentar
Kann viele Ursachen haben, sdelete wird nicht gefunden (da hilft ganzen Pfad angeben), die Datei/Verzeichnis hat Leerzeichen und es wird nicht ordentlich mit den Anführungszeichen gearbeitet.
Fürs Debugging:
Als erstes in Zeile 18 mal eintragen:
Dann siehst Du den Befehl der zusammengebaut wird und versucht wird auszuführen.
Den mal kontrollieren und mal direkt in der Kommandozeile ausprobieren ob er tut.
Und ich würde immer absolute Pfade verwenden.
Fürs Debugging:
Als erstes in Zeile 18 mal eintragen:
wscript.echo "sdelete64.exe -p 3 -s -q" & " " & strArg
Den mal kontrollieren und mal direkt in der Kommandozeile ausprobieren ob er tut.
Und ich würde immer absolute Pfade verwenden.
Ist es auch, ich hatte mir den Rest des Codes nicht so genau angeschaut.
Die Schleifenvariable strArg hat nur INNERHALB der Schleife Werte.
Nach der Schleife ist die wieder leer.
Deswegen hat sie beim Aufruf von sdelete64 auch keinen Inhalt.
Wenn Du für jede Datei/Verzeichnis die im Drag und Drop übergeben wird einen eigenen sdelete64 Aufruf starten möchtest/musst, dann muß der WShell.Run Aufruf in die Schleife rein.
Wenn Du die Dateien/Verzeichnisse in einem Aufruf mit sdelete64 löschen willst, dann musst Du die einzelnen Dateien/Verzeichnisse in der Schleife in eine andere Variable schreiben, so das alle hinterher in der Variablen drinstehen, also in etwa so:
Die Schleifenvariable strArg hat nur INNERHALB der Schleife Werte.
Nach der Schleife ist die wieder leer.
Deswegen hat sie beim Aufruf von sdelete64 auch keinen Inhalt.
Wenn Du für jede Datei/Verzeichnis die im Drag und Drop übergeben wird einen eigenen sdelete64 Aufruf starten möchtest/musst, dann muß der WShell.Run Aufruf in die Schleife rein.
Wenn Du die Dateien/Verzeichnisse in einem Aufruf mit sdelete64 löschen willst, dann musst Du die einzelnen Dateien/Verzeichnisse in der Schleife in eine andere Variable schreiben, so das alle hinterher in der Variablen drinstehen, also in etwa so:
For Each strArg In objArgs
strPara = strPara & " """ & strArg & """"
Next
...
WshShell.Run "sdelete64.exe -p 3 -s -q " & strPara
Na ja, Textdatei lesen ist jetzt nicht so kompliziert, könnte man sicherlich auch bei Google finden:
Und wenn dann sowieso nur ein Parameter übergeben wird, dann braucht man auch die Schleife bei den Argumenten nicht.
Ich würde dann den Parameter benannt übergeben, d.h. der Aufruf aus dem Classic Explorer sähe so aus:
wscript.exe Pfad\Skript.vbs /Datei:"%3"
Das Skript (jetzt ohne Abfrage ob gelöscht werden soll und mit einem Aufruf von SDELETE pro Datei/Verzeichnis und ungestestet):
Du könntest natürlich auch in der Schleife wieder den String zusammenbasteln und es in einem Aufruf an SDELETE übergeben, ABER:
Die Kommandozeile hat Begrenzungen was die Länge angeht, d.h. über die Datei können mehr Dateien/Verzeichnisse übergeben werden, als Du per Kommandozeile an SDELETE übergeben kannst. Und es gibt sicher Anwender, die 10.000 Dateien so markieren und versuchen würden zu löschen.
Und wenn dann sowieso nur ein Parameter übergeben wird, dann braucht man auch die Schleife bei den Argumenten nicht.
Ich würde dann den Parameter benannt übergeben, d.h. der Aufruf aus dem Classic Explorer sähe so aus:
wscript.exe Pfad\Skript.vbs /Datei:"%3"
Das Skript (jetzt ohne Abfrage ob gelöscht werden soll und mit einem Aufruf von SDELETE pro Datei/Verzeichnis und ungestestet):
' Benötigte Objekte und Konstanten
Set WshShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1
'Befehlszeile einlesen
Set objArgs = WScript.Arguments
sFile = objArgs.Named("Datei")
'Datei öffnen und Zeile für Zeile einlesen
Set oFile = fso.OpenTextFile(sFile, ForReading)
sTemp = oFile.ReadLine
While Not oFile.AtEndOfStream
WshShell.Run ("sdelete64.exe -p 3 -s -q """ & sTemp & """"), 0, True
sTemp = oFile.ReadLine
Wend
oFile.Close
' Datei Löschen
Call fso.DeleteFile(sFile)
Du könntest natürlich auch in der Schleife wieder den String zusammenbasteln und es in einem Aufruf an SDELETE übergeben, ABER:
Die Kommandozeile hat Begrenzungen was die Länge angeht, d.h. über die Datei können mehr Dateien/Verzeichnisse übergeben werden, als Du per Kommandozeile an SDELETE übergeben kannst. Und es gibt sicher Anwender, die 10.000 Dateien so markieren und versuchen würden zu löschen.