oreuss
Goto Top

Argumente über ziehen und fallen lassen übergeben und strings modifizieren

Sers,

ich schreibe gerade an einem Script für das "SendTo" -Menü von Windows.
Die Dateiliste mit den Pfaden zu übergeben krieg ich wohl hin, aber ich bekomme beim Ausführen nen Fehler in der 2.Zeile bei Zeichen 3 (Anweisung erwartet).

Den Rest des Scripts habe ich aus dem Internet und dem halbwissen meinerseits zusammengeklaubt.

Vielleicht mag jemand seinen Senf dazugeben.
Bin eigentlch eher in der CNC-Programmierung unterwegs und mach das Scripteschreiben dann, wenn es mir zu blöd ist 3 Explorer-Fenster nebeneinander auf den Monitor zu tapezieren.

Dank im Voraus für Kritik, Humor und Schelte.

Hier eine Aufstellung, was das Script machen soll.

- Datei-Pfad-Liste über SendTo an Script übergeben
- Pfad modifizieren
- Dateien aus Ursprungspfad in modifizierten Pfad kopieren
- eventuell ein Log ausgeben

' ***********************************  
' ** Konstantendeklaration  
' ** Ursprungs und Zielpfad  
' ***********************************  
Dim ccvon, ccnach
ccvon = "Z:\CAD-Daten"  
ccnach = "Z:\Rüstdaten"  
' ***********************************  
' ** fehlermeldung wenn keine Argumente übergeben wurden  
' ***********************************  
Dim iArgs
Set iArgs = WScript.Arguments
If iArgs.Count = 0 Then
	MsgBox "Ohne Argumente wird's nichts!",0,WScript.ScriptName  
	WScript.Quit
End If
' ***********************************  
' ** Pfade und Dateiliste ermitteln  
' ** Pfadliste mit dem geforderten Eingabeverzeichnis vergleichen  
' ** Fehlermeldung bei falschem Ursprungspfad  
' ***********************************  
Dim iipath, iifilename, vvvergl
For i = 0 to iArgs.Count - 1
	iipath(i)     = GetPath_From_FilePath(iiquelle(i))
	iifilename(i) = GetFileName_From_FilePath(iiquelle(i))
	vvvergl = InStr(1, iipath(i), ccvon, 1)
	if vvvergl = 0 then
		MsgBox "Diese Script kann nur aus einem Unterverzeichnis von " & ccvon & " gestartet werden!",0,WScript.ScriptName  
		WScript.Quit
	End If
Next
' ***********************************  
' ** Pfadliste modifizieren  
' ***********************************  
Dim ooziel
For i = 0 to iiquelle.Count - 1 		' ** alle Argumente holen  
   'vvvtemp(i) = Text & vvvquelle.item(i)  
   Replace "ooziel(i)" , "ccvon", "ccnach"  
Next
' ***********************************  
' ** if notexist pfade anlegen  
' ***********************************  
For i = 0 to ooziel.Count - 1
	if not fso.FolderExists( ooziel(i) ) then fso.CreateFolder( ooziel(i) )
Next
' ***********************************  
' ** dateien kopieren  
' ***********************************  
For i = 0 to ooziel.Count - 1
	fso.CopyFile "", "" ',Overwrite True  
Next
' ***********************************  
' ** ausgabe mit log  
' ***********************************  
MsgBox "Script erfolgreich beendet"  
' Ich wüsste zwar was ich in das Log schreiben würde,
' habe aber keinen blassen Schimmer wie das zu bewerkstelligen ist.
WScript.Quit 'reicht für's erste


[Edit Biber] Codeformatierung. [/Edit]

Content-Key: 188977

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

Printed on: April 19, 2024 at 12:04 o'clock

Member: rubberman
rubberman Aug 01, 2012 updated at 21:30:14 (UTC)
Goto Top
Hallo Oreuss.

Ich denke man müsste das einmal komplett neu schreiben face-wink Du hantierst mit Funktionen und Objekten, die nicht mal existieren etc.
Egal. Wichtig wäre, erst mal das Konzept zu klären.
1.) Du schreibst was vom SendTo Menü, im gleichen Atemzug, dass du eine Dateiliste übergeben willst und letztlich auch noch was von Drag/Drop. Ja was denn nun?
2.) Ich gehe davon aus dass alle Dateien letztlich igendwo in 'ccvon' existieren müssen, dass sie vom Script überhaupt verarbeitet werden sollen. Auch in Unterverzeichnissen? Müssen diese Unterverzeichnisse auch in 'ccnach' erstellt werden?
3.) Wie soll mit Dateien umgegangen werden, die womöglich schon in 'ccnach' existieren?
4.) Logfile. Gut dass du weißt was rein soll face-wink Was wäre das denn? Und wo soll es erstellt werden?

Fragen über Fragen ... face-wink

Grüße
rubberman
Member: bastla
bastla Aug 01, 2012, updated at Aug 03, 2012 at 23:53:01 (UTC)
Goto Top
@rubberman
Grundsätzliches ACK - geschätzt sollte das wohl etwa Folgendes werden:
Von = "Z:\CAD-Daten"  
Nach = "Z:\Rüstdaten"  
' *  
' fehlermeldung wenn keine Argumente übergeben wurden  
' *  
Set Args = WScript.Arguments
If Args.Count = 0 Then
    MsgBox "Ohne Argumente wird's nichts!", 0, WScript.ScriptName  
    WScript.Quit
End If

Set fso = CreateObject("Scripting.FileSystemObject")  
' *  
' Pfade und Dateiliste ermitteln  
' Pfadliste mit dem geforderten Eingabeverzeichnis vergleichen  
' Fehlermeldung bei falschem Ursprungspfad  
' *  
LV = Len(Von)
For Each Quellpfad In Args
    If LCase(Left(Quellpfad, LV)) <> LCase(Von) Then
        MsgBox "Dieses Script kann nur aus einem Unterverzeichnis von """ & Von & """ gestartet werden!", 0 ,WScript.ScriptName  
        WScript.Quit
    End If
    If fso.FolderExists(Quellpfad) Then
        MsgBox """" & Quellpfad & """ ist ein Ordner - dieses Script kann aber nur zum Kopieren von Dateien verwendet werden!", 0, WScript.ScriptName  
        WScript.Quit
    End If
    ' *  
    ' Pfad modifizieren  
    ' *  
    Zielpfad = Replace(Quellpfad, Von, Nach, 1, 1, vbTextCompare)
    If fso.FolderExists(Zielpfad) Or fso.FileExists(Zielpfad) Then 
        MsgBox """" & Zielpfad & """ existiert bereits!", 0, WScript.ScriptName  
        WScript.Quit
    End If
    ' *  
    ' if notexist pfade anlegen  
    ' *  
    ZielPfadOrdner = Split(Zielpfad, "\")  
    ZielTeilPfad = ZielPfadOrdner(0)
    For i = 1 To UBound(ZielPfadOrdner) - 1
        ZielTeilPfad = ZielTeilPfad & "\" & ZielPfadOrdner(i)  
        If fso.FileExists(ZielTeilPfad) Then
            MsgBox "Ordner """ & ZielTeilPfad & """ kann nicht erstellt werden!", 0, WScript.ScriptName  
            WScript.Quit
        End If
        If Not fso.FolderExists(ZielTeilPfad) Then fso.CreateFolder(ZielTeilPfad)
    Next
    ' *  
    ' Datei kopieren  
    ' *  
    fso.CopyFile Quellpfad, ZielPfad ',Overwrite True  
Next
' *  
' ausgabe mit log  
' ***  
MsgBox "Script erfolgreich beendet"  
Grüße
bastla

P.S.: Wo es wohl Variablennamen der Art "ccvon" oder "iipath" zu kaufen gibt? face-wink
Member: Biber
Biber Aug 02, 2012 at 06:54:57 (UTC)
Goto Top
[OT]
Moin bastla,
Zitat von @bastla:
P.S.: Wo es wohl Variablennamen der Art "ccvon" oder "iipath" zu kaufen gibt? face-wink
Gab es in meiner Jugend auch schon - ich erinnere mich an bbking, jjcale und zztop.

Grüße
Biber
[/OT]
Member: bastla
bastla Aug 02, 2012 at 07:31:36 (UTC)
Goto Top
[OT2]
Hallo Biber!

Das ergab dann sicher ein super Programm ... face-wink

Grüße
bastla

P.S.: Und danke, dass Du gganderson nicht erwähnt hast ... face-wink
[/OT2]
Member: Biber
Biber Aug 02, 2012 updated at 18:06:58 (UTC)
Goto Top
[OT ii]
Zitat von @bastla:
[OT2]
Hallo Biber!
P.S.: Und danke, dass Du gganderson nicht erwähnt hast ... face-wink
[/OT2]
Und vvbach, pplangstrumpf und den ttsee hab ich uns auch erspart. face-wink
[/OT ii]
Member: brammer
brammer Aug 02, 2012 at 13:22:32 (UTC)
Goto Top
Hallo,

niveau im freien Fall.
So nannte man das früher...

brammer
Member: Oreuss
Oreuss Aug 02, 2012 updated at 22:16:34 (UTC)
Goto Top
Dank erst einmal für die rege Anteilnahme.

bezgl. der variablen mit den führenden cc vv ii oo:

Ich habe von vorn herein versucht variablen nach deren Sinn zu strukturieren

cc Konstante
vv Variable
ii Input
oo Output


@rubberman
Umriss der Funktionsweise und der Handlungen des Scipts:

- Eine Verknüpfung des Scripts soll im SendTo -Menü abgelegt sein.

- Dateien (ein oder mehrere) sollen dann über das Kontextmenü an das Script übergeben werden
=> dabei wird die Liste der Argumente erzeugt.

- Zum Verfahren bei den Pfaden sei soviel gesagt: in CAD-Daten werden Zeichnungen und andere Daten erstellt,
die über das Script in Rüstdaten bereitgestellt werden sollen

- der Algorithmus bei der Erstellung der Verzeichnisse sieht wie folgt aus:
Ursprungsordner Bereitstellungsordner
------------------------------------------------------------------------------------
Z:\CAD-Daten\1111\test.pdf Z:\Rüstdaten\1111\test.pdf
Z:\CAD-Daten\2222\test.txt Z:\Rüstdaten\2222\test.txt
Z:\CAD-Daten\1111\2222\test.pdf Z:\Rüstdaten\1111\2222\test.pdf
und so weiter und so fort.

- Das Eingangsverzeichnis wird bei der Scriptdefinition als Konstante festgelegt
und es sollen nur Unterverzeichnisse des
Eingangsverzeichnis als Argumente angenommen werden.

- nach Ausgabe einer Fehlermeldung soll es möglich sein vorhandene Dateien zu überschreiben.

- eine Auswahl der Dateien über die Windows -Suche sollte möglich sein.
=> da wird's spassig. es können mehrere "unterschiedliche" Pfade in den Argumenten sein.

- und wenn's geht sollte das Script noch nen gscheiten kaffee kochen.
der Kaffeautomat ist grausig.


@bastla:
habe mir den Entwurf angesehen und es erscheint logisch.
Würde aber lügen wenn ich jetzt sagen würde das bei mir die Groschen fallen.

Dafür befaß ich mich damit zu selten.

Nun habe ich Deinen Entwurf mal 1 zu 1 getestet und ich bekomme die gleiche Fehlermeldung wie in meiner Version.

Windows Scripting Host
Zeile: 2
Zeichen: 3
Fehler: Anweisung erwartet
Code: 800A0400
Quelle: Kompilierungsf. in ms vbs

p.s.: habe kein Office installiert.

Reite auf dem Windows Scripting Hostherum.

Im Notpad++ mit ms debugger läuft er schnurstraks in die fehlenden Argumente hinein.

Ist da was mit dem Windows Scripting Host????

Bin auf Windows 7 Ultimate 64bit SP1 unterwegs.


Folgender Quellcode als VBS gespeichert und den Link ab in's SendTo geht wie die Sau.
Die Argumente werden schön angezeigt.
Das Script ist natürlich nicht von mir, der Urspung ist auf dieseyer.de

set oArgs = Wscript.Arguments
If oArgs.Count = 0 then
  MsgBox "Ohne Argumente wird's nichts!", ,WScript.ScriptName  
  WScript.Quit
End If

Text = "Das waren die Argumente:" & vbCRLF  
For i = 0 To oArgs.Count - 1 '             hole alle Argumente  
  Text = Text & oArgs.item(i) & vbCRLF
Next
MsgBox Text, ,WScript.ScriptName 
Member: bastla
bastla Aug 02, 2012, updated at Aug 03, 2012 at 06:41:13 (UTC)
Goto Top
Hallo Oreuss!

Zum Thema Variablen: Deklariert hast Du auch brav - allerdings würde ich dann noch dringend zu "Option Explicit" raten, damit das auch Sinn bekommt ...
Fehlermeldung kann ich nicht bestätigen.
BTW: Würdest Du bitte Biber entlasten und selbst die "Code"-Formatierung vornehmen und vielleicht auch noch "dieseyer.de" richtig zitieren?

Grüße
bastla

P.S.: Deine Art der Variablenbenennung würde ich im Fall des Falles etwas einfacher / lesbarer zB
cVon
iPfad
vVergl
schreiben ...

[Edit] "x" nachgereicht [/Edit]
Mitglied: 76109
76109 Aug 02, 2012, updated at Aug 03, 2012 at 07:24:19 (UTC)
Goto Top
[OT]
@bastla
Zum Thema Variablen: Deklariert hast Du auch brav - allerdings würde ich dann noch dringend zu "Option Eplicit" raten, damit das auch Sinn bekommt ...
Diese Option kannte ich noch garnichtface-wink

Gruß Dieter
[/OT]
Member: Oreuss
Oreuss Aug 02, 2012 at 22:58:22 (UTC)
Goto Top
... hatte das vbs in das sendto kopiert anstatt eine verknüpfung darauf zu erstellen

=> nun tut es Bastla's Version

@bastla und Biber

die Code -Formatierung werde ich von nun an selbst übernehmen... sorry

die Option Explicit werde ich einsetzen.
guter Einwand
Member: Oreuss
Oreuss Aug 03, 2012 at 04:12:57 (UTC)
Goto Top
es ergibt sich gerade zum debugging eine Frage die Google nicht hinreichend beantworten konnte.

Ist es möglich die Argumente zu testzwescken manuell zu deklarieren.
Member: bastla
bastla Aug 03, 2012 updated at 20:30:55 (UTC)
Goto Top
Hallo Oreuss!
Ist es möglich die Argumente zu testzwescken manuell zu deklarieren.
Das kannst Du zB so machen:
Von = "Z:\CAD-Daten"  
Nach = "Z:\Rüstdaten"  
' *  
' fehlermeldung wenn keine Argumente übergeben wurden  
' *  
'Set Args = WScript.Arguments  
'If Args.Count = 0 Then  
'    MsgBox "Ohne Argumente wird's nichts!", 0, WScript.ScriptName  
'    WScript.Quit  
'End If  
Set Args = Array("Z:\CAD-Daten\2222\test.txt", "Z:\CAD-Daten\1111\2222\test.pdf")  
oder einfach mit einem Batch das Script starten und die Argumente mit in die Befehlszeile schreiben:
"%appdata%\Microsoft\Windows\SendTo\Kopieren.vbs" "Z:\CAD-Daten\2222\test.txt" "Z:\CAD-Daten\1111\2222\test.pdf"
Grüße
bastla
Member: bastla
bastla Aug 03, 2012 updated at 06:41:41 (UTC)
Goto Top
[OT2] @Dieter
Diese Option kannte ich noch garnichtface-wink
Ich war auch überrascht ... face-wink

Danke, korrigiere ich der Ordnung halber oben.

Grüße
bastla
[/OT2]
Member: Oreuss
Oreuss Aug 03, 2012 at 17:23:30 (UTC)
Goto Top
Sehr elegant, auch gleich die Fehlerquelle eines übergebenen Verzeichnisses abzufangen.
Auf die Idee wäre ich nicht gekommen, Nen User aber bestimmt face-wink

    If fso.FolderExists(Quellpfad) Then
        MsgBox """" & Quellpfad & """ ist ein Ordner - dieses Script kann aber nur zum Kopieren von Dateien verwendet werden!", 0, WScript.ScriptName  
        WScript.Quit
    End If



Aber wie ist das überhaupt mit dem Aufruf von Quellpfad in Zeile 19?
For Each Quellpfad In Args 
Nirgends deklariert, einfach aufgerufen und tut.
ist das nen regulärer Ausdruck?
können die nun schon deutsch bei ms oder habe ich Tomaten auf den Augen?

wenn's nen regulärer Ausdruck ist, wie ist das auf ner englischen Windows-Version.
Member: rubberman
rubberman Aug 03, 2012 at 19:11:38 (UTC)
Goto Top
Zitat von @Oreuss:
Aber wie ist das überhaupt mit dem Aufruf von Quellpfad in Zeile 19?
Nirgends deklariert, einfach aufgerufen und tut.

Das ist einfach ein Variablenname. Die Deklaration erfolgt "On The Fly", wie in VBScript möglich. Mit Option Explicit solltest du dafür aber eine Fehlermeldung einfangen face-wink

Zitat von @Oreuss:
können die nun schon deutsch bei ms

Ja, die Entwickler von M$ sind alle aus Deutschland emigrierte Friesische Mähnenrinder. Wenn sie uns nicht auf die Hörner nehmen, dann lauern sie uns zumindest im Dickicht der Speicheradressen auf und versuchen uns mit einem virtuellen Biss ins Genick nieder zu strecken face-wink

Grüße
rubberman
Member: Oreuss
Oreuss Aug 03, 2012 at 23:44:57 (UTC)
Goto Top
der Fehler ist für mich ein Rätsel
ich habe wahrscheinlich noch nen Strukturfehler drin.


Option Explicit
' **********************************************************************************  
' ** Konstantendeklaration *********************************************************  
' **********************************************************************************  
Dim Von, Nach
Von = "Z:\CAD-Daten"  
Nach = "Z:\Rüstdaten"  
' **********************************************************************************  
' ** fehlermeldung wenn keine Argumente übergeben wurden ***************************  
' **********************************************************************************  
Dim Args
'Args = Array("Z:\CAD-Daten\Test1\Testdatei1.Typ","Z:\CAD-Daten\Test2\Untertest2\Testdatei2.Typ")  
Set Args = WScript.Arguments
If Args.Count = 0 Then
    MsgBox "Ohne Argumente wird's nichts!",0, WScript.ScriptName  
    WScript.Quit
End If
' **********************************************************************************  
' ** Pfade und Dateiliste ermitteln                               ******************  
' ** Pfadliste mit dem geforderten Eingabeverzeichnis vergleichen ******************  
' ** Fehlermeldung bei falschem Ursprungspfad                     ******************  
' **********************************************************************************  
Dim LV, Quellpfad, Zielpfad, fso
Set fso = CreateObject("Scripting.FileSystemObject")  
LV = Len(Von)
For Each Quellpfad In Args
    If LCase(Left(Quellpfad, LV)) <> LCase(Von) Then ' <> ungleich  
        MsgBox "Diese Script kann nur aus einem Unterverzeichnis von """ & Von & """ gestartet werden!",0,WScript.ScriptName  
        WScript.Quit
    End If
    If fso.FolderExists(Quellpfad) Then
        MsgBox """" & Quellpfad & """ ist ein Ordner - dieses Script kann aber nur zum Kopieren von Dateien verwendet werden!", 0, WScript.ScriptName  
        WScript.Quit
    End If
    ' ******************************************************************************  
    ' ** Pfad modifizieren *********************************************************  
    ' ******************************************************************************  
    Zielpfad = Replace(Quellpfad, Von, Nach, 1, 1, vbTextCompare)
    'If fso.FolderExists(Zielpfad) Or fso.FileExists(Zielpfad) Then   
    '    MsgBox """" & Zielpfad & """ existiert bereits!", 0, WScript.ScriptName  
    '    WScript.Quit  
    'End If  
    ' ******************************************************************************  
    ' ** ifnotexist Pfade anlegen **************************************************  
    ' ******************************************************************************  
    Dim ZielPfadOrdner, ZielTeilPfad, i
    ZielPfadOrdner = Split(Zielpfad, "\")  
    ZielTeilPfad = ZielPfadOrdner(0)
    For i = 1 To UBound(ZielPfadOrdner) - 1
        ZielTeilPfad = ZielTeilPfad & "\" & ZielPfadOrdner(i)  
        If fso.FileExists(ZielTeilPfad) Then
            MsgBox "Ordner """ & ZielTeilPfad & """ kann nicht erstellt werden!", 0, WScript.ScriptName  
            WScript.Quit
        End If
        If Not fso.FolderExists(ZielTeilPfad) Then fso.CreateFolder(ZielTeilPfad)
    Next
    ' ******************************************************************************  
    ' ** Wenn Datei vorhanden abfrage ob überschreiben *****************************  
    ' ******************************************************************************  
    Dim answer
    If fso.FileExists(Zielpfad) Then
    	Set shell = WScript.CreateObject("WScript.Shell")  
    	answer = MsgBox ("Soll die folgende Datei überschrieben werden?" &VbCrLf& "Datei:"""& Quellpfad &"" ,vbYesNoCancel,WScript.ScriptName)  
    	' **************************************************************************  
    	' ** Abbruch durch Benutzer ************************************************  
    	' **************************************************************************  
    	If answer = vbCancel Then
    		WScript.Quit
    	Else
    	' **************************************************************************  
    	' ** Auswahl vbYes Datei kopieren ******************************************  
    	' **************************************************************************  
		If answer = vbYes Then
			fso.CopyFile Quellpfad, Zielpfad, True
		Else
        ' **************************************************************************  
    	' ** Auswahl vbNo nichts tun ***********************************************  
    	' **************************************************************************  
		If answer = vbNo Then
		Else
    End If
    ' ******************************************************************************  
    ' ** Wenn die Datei nun noch nicht existiert wird automatisch kopiert **********  
    ' ******************************************************************************  
    If Not fso.FileExists(Zielpfad) Then
		fso.CopyFile Quellpfad, Zielpfad	
    End If
Next
' **********************************************************************************  
' ** ausgabe mit log ***************************************************************  
' **********************************************************************************  
MsgBox "Script erfolgreich beendet",vbOK  
Member: bastla
bastla Aug 04, 2012 updated at 00:10:36 (UTC)
Goto Top
Hallo Oreuss!
der Fehler ist für mich ein Rätsel
... und um es auch für uns spannender zu machen, nennst Du ihn gleich gar nicht ... face-wink
ich habe wahrscheinlich noch nen Strukturfehler drin.
Wenn es nach 3 "If" nur ein einziges "End If" gibt, kann man das wohl so nennen ... face-wink
Schöner ist eine Lösung mit "Select Case" - etwa:
    Dim answer
    If fso.FileExists(Zielpfad) Then
    	answer = MsgBox ("Soll die folgende Datei überschrieben werden?" &VbCrLf& "Datei:"""& Quellpfad &"" ,vbYesNoCancel,WScript.ScriptName)  
        Select Case answer
        Case vbCancel
            ' **************************************************************************  
            ' ** Abbruch durch Benutzer ************************************************  
            ' **************************************************************************  
            WScript.Quit
    	Case vbYes
            ' **************************************************************************  
            ' ** Auswahl vbYes Datei kopieren ******************************************  
            ' **************************************************************************  
            fso.CopyFile Quellpfad, Zielpfad, True
        Case Else
            ' **************************************************************************  
            ' ** Auswahl vbNo nichts tun ***********************************************  
            ' **************************************************************************  
        End Select
    Else 'Zieldatei existiert noch nicht  
        'Zielpfad erstellen  
        'Datei kopieren  
    End If
Außerdem würde ich (wie im "Else"-Zweig schon angedeutet) die Abfrage schon an der ursprünglichen Position (ab Zeile 40) platzieren, da dann der unnötige Versuch, den Zielpfad (den muss es ja schon geben) zu erstellen, unterbleiben kann ...

... und, nur zur Sicherheit, trotzdem vorweg feststellen, ob der Zielpfad schon durch einen vorhandenen Ordner "besetzt" ist ...

Grüße
bastla
Member: Oreuss
Oreuss Aug 05, 2012 at 19:14:18 (UTC)
Goto Top
Der Zielpfad kann, muß aber nicht existieren.
Member: bastla
bastla Aug 05, 2012 at 21:44:12 (UTC)
Goto Top
Hallo Oreuss!
Der Zielpfad kann, muß aber nicht existieren.
Glaube ich Dir auf's Wort ...

Grüße
bastla
Member: Oreuss
Oreuss Aug 05, 2012 at 22:27:10 (UTC)
Goto Top
Das Thema ist für mich gelöst.

Ein paar Sachen habe ich modifiziert und werde ich modifizieren.

Ich bedanke mich für die Kritik, den Humor und die Schelte