batch-alor
Goto Top

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 face-smile

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

Content-Key: 323602

Url: https://administrator.de/contentid/323602

Printed on: April 23, 2024 at 20:04 o'clock

Member: AndreasHoster
Solution AndreasHoster Dec 12, 2016 at 09:59:49 (UTC)
Goto Top
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:
wscript.echo "sdelete64.exe -p 3 -s -q" & " " & strArg   
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.
Member: Batch-Alor
Batch-Alor Dec 13, 2016 at 08:43:42 (UTC)
Goto Top
Moin,

die echo Antwort ist "sdelete64.exe -p 3 -s -q" (ohne Anführungszeichen)

Das Argument wird leider nicht mit übertragen.
Ich hab mal rumgegoogelt aber nicht wirklich eine Lösung gefunden.

Das kann doch nur ein kleiner HAken ander Sache sein, oder?

Gruß
Werner
Member: AndreasHoster
AndreasHoster Dec 13, 2016 at 09:09:13 (UTC)
Goto Top
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:
For Each strArg In objArgs 
  strPara = strPara & " """ & strArg & """"  
Next 
...
WshShell.Run "sdelete64.exe -p 3 -s -q " & strPara   
Member: Batch-Alor
Batch-Alor Dec 14, 2016 at 13:31:39 (UTC)
Goto Top
Soderle face-smile,

jetzt passt alles, vielen Dank für die Unterstützung.

Der komplette Cose sieht jetzt so aus:

Set objArgs = WScript.Arguments
Set WshShell = WScript.CreateObject("WScript.Shell")  

'On Error Resume Next  


For Each strArg in objArgs
	Objekt = Objekt & " """ & strArg & """"  
  'WScript.Echo strArg  
  'WScript.Echo Objekt  

Next


dim Frage
dim Text

Text="Das ausgewählte Objekt wird unwiderruflich gelöscht" _  
 & vbLF & "und mehrfach (5x) überschrieben (DOD 5220.22-M)" _  
 & vbLF & vbLF & "Es besteht keine Möglichkeit zur Datenrettung" _  
 & vbLF & vbLF & "Der Löschvorgang kann je nach Date-/Ordnergröße" _  
 & vbLF & "mehrere Minuten dauern!"  
 
Frage=msgbox(Text,+vbyesno +VbExclamation,"Sicheres löschen")  

if Frage=vbyes then

'wscript.echo "sdelete64.exe -p 3 -s -q " & Objekt  

WshShell.Run ("sdelete64.exe -p 3 -s -q " & Objekt), 0, true  

MsgBox "Löschvorgang erfolgreich beendet", vbokonly, "Sicheres löschen"  

end if


Jetzt hat sich allerdings noch ein kleines Ungemach bezüglich des "ClassicExplorers" eingeschlichen:

Bei selbstdefinierten Toolbar Buttons (und das soll ja o.a. Script sein bzw. ausführen) stellt der ClassicExplorer
etwas "seltsame" Parameter zur Verfügung

Auszug aus dem Help File:


custom executable string - this can be a name of a program and its arguments, or even a URL (like http://www.google.com). You can use environment variables like %SystemRoot%. You can also use the placeholders %1, %2, %3, %4 and %5:

%1 is the path of the current folder. Keep in mind that if the current folder is a root of a drive it will end with a backslash (like C:\)

%2 is the path of the selected file (only when a single file is selected)

%3 is a name of a temporary text file that contains all selected files. Each line in the text file contains one file with its full path

%4 is the same as %3, but the file is in Unicode (UTF16) format. The file contains no byte order mark. %3 and %4 can't both be used by the same command

Note to developers: When %3 or %4 is used, it is the responsibility of the command to delete the temporary file when it finishes. Otherwise the temp file will be left behind and waste disk space. Also if the command is a console application or a batch file it will be launched in silent mode with no console window

%5 is a name of a temporary text file, which can be used to return a command back to Classic Explorer. If the first 2 bytes of the file are 255 and 254, the file is treated as Unicode. Only one command can be used at a time.

The command can be:
open <folder name> - causes Explorer to navigate to the given folder
select <list of file names> - selects the given files, deselects the rest. The file names must be separated by a tab or a newline character. The files should not contain a path. If they do, the path will be ignored

refresh - refreshes Explorer
Note to developers: commands using %5 will run in silent mode (like commands using %3 or %4) but also Explorer will wait for the process to finish. The process must finish as quickly as possible, because Explorer will be frozen during the execution of the command


wobei %1 und %2 schon klar ist.
%2 funktioniert für den Script ja auch wunderbar, allerdings eben nur für einen !! File/Ordner - so wie im Help File angegeben.

Wenn man nun mehrere Files/Ordner selektiert muss das dann über den Parameter %3 gemacht werden.
Der wiederum erzeugt einen Tempfile (mit ständig wechseldem Namen) dessen Pfad und Dateiname ins
ins UserTemp in Appdata/local zeigt, und - wie beschrieben - in jeder Zeile eben den einzelnen Pfad nebst Dateinamen
enthält.

Heißt man müsste erst mal den in %3 übergebenen Tempfile öffnen, den Inhalt in ein Array lesen, hieraus einen
String bilden der, mit " " getrennt einen verwertbaren Parameter für SDelete erzeugt.
Also so:

sdelete -p 3 -s -q "E:\Test\Folder01" "E:\Test\File01.exe" "E:\Test\Archiv.zip"


Und da steckt der Werner nun schon wieder fest face-smile

Gruß
Werner
Member: AndreasHoster
AndreasHoster Dec 19, 2016 at 16:01:26 (UTC)
Goto Top
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):
' 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.