WinFuture-Forum.de: VBScript Ordner auf Netzwerkspeicher verschieben - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

VBScript Ordner auf Netzwerkspeicher verschieben


#1 Mitglied ist offline   je77 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 25. Januar 18
  • Reputation: 0

geschrieben 29. Oktober 2018 - 19:00

Hallo,
ich habe ein VBScript programmiert, das den/die Ordner, die man auf das Skript zieht, um den Pfad zu übergeben, auf meinen
Netzwerkspeicher verschieben soll.
Leider erhalte ich die Meldung "Erlaubnis verweigert". Ich habe gegoogelt, das Skript nach Fehlern durchsucht. Finde den Fehler nicht...
Die Meldung kommt in der Zeile mit dem Movefolder-Befehl.
Vielleicht wäre jemand so freundlich und hilft mir?
Darüber würde ich mich sehr freuen.
Viele Grüße, je77

Dim Jahr,Monat,Tag,Datum,fso,args,x,foname,pfad
Set fso = CreateObject("Scripting.FileSystemObject")
pfad="X:\Papierkorb"
Set args=WScript.Arguments
Jahr=year(Date)
Monat=Month(Date)
Tag=Day(Date)
Datum=Jahr & "-" & Monat & "-" & Tag
If Not fso.FolderExists(pfad & "\" & Datum) Then fso.CreateFolder(pfad & "\" & Datum)
For Each x in args
    If fso.FolderExists(x) Then
    	foname=Mid(x,InStrRev(x,"\")+1)
    	MsgBox(foname)
    	fso.MoveFolder x, pfad & "\" & Datum & "\" & foname
    End If
Next


0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.681
  • Beigetreten: 20. Juli 07
  • Reputation: 1.075

geschrieben 29. Oktober 2018 - 23:57

Zunächst mal ist ein Syntaxfehler da drin: das End If ganz am Ende fehlt noch.

Und dann hab ich da mal drübergeschaut. Das Script selbst scheint erstmal zu passen.

Aber, gibt es den "Papierkorb"-Ordner bereits? Wenn nicht, dann könnte es daran liegen.

Außerdem benötigst Du Schreibrechte, und der Quellordner darf nicht offen sein.

Wo ich grad nicht nochmal geschaut hab, was aber immer ein potentielles Problem mit MOVE vs COPY ist: wenn man von einem Volume auf ein anderes verschieben will. Da geht oft MOVE nicht. In dem Fall mußt Du tatsächlich den Ordner erst kopieren und wenn das fertig ist, den Quellordner löschen.


Getestete Implementierung mit geringfügigen Änderungen und einer kleinen Erweiterung:

Option Explicit

Function LPad(strInput, strPadChar, iPadLength)
Dim output: output = ""
Dim tmp: tmp = ""

Dim i: For i = 0 To iPadLength -1 
tmp = tmp & Cstr(strPadChar)
Next 
output = Right(tmp &strInput, iPadLength)
LPad = output
End Function

Dim Datum,x,foname
Dim fso  : Set fso   = CreateObject("Scripting.FileSystemObject")
Dim Pfad :     pfad  = "z:\testpfad"
Dim args : Set args  = WScript.Arguments
Dim dtJetzt: dtJetzt = Now()

Dim Jahr :     Jahr  = Year(dtJetzt)
Dim Monat:     Monat = Month(dtJetzt)
Dim Tag  :     Tag   = Day(dtJetzt)


Datum = LPad(Jahr,0, 4) & "-" & LPad(Monat,0, 2) & "-" & LPad(Tag,0,2)


If Not fso.FolderExists(pfad & "\" & Datum) Then
    fso.CreateFolder pfad & "\" & Datum
    For Each x in args
        If fso.FolderExists(x) Then
'            foname = Mid(x,InStrRev(x,"\")+1)
            foName = fso.GetFolder(x).Name
            MsgBox foname
            fso.MoveFolder x, pfad & "\" & Datum & "\" & foname
        End If
    Next
End If




Hatte das eigentlich noch nachkommentiert, aber WF frißt wieder mal die Hälfte. Sorry. Ist hoffentlich ausreichend selbsterklärend, was da passiert.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   je77 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 25. Januar 18
  • Reputation: 0

geschrieben 30. Oktober 2018 - 16:58

Hallo RalphS,
vielen Dank für deine sehr gute Antwort!!
Der Tip mit dem zuerst Copyfolder, dann Deletefolder war es!
Jetzt klappt es...
Allerdings hätte ich noch eine kleine Anmerkung:
Das End if am Ende fehlt nicht. Es ist so gewollt dass das Ordneranlegen nur gemacht wird wenn der Ordner noch nicht existiert. Es gibt schliesslich den Fall dass der Code 2 oder mehrmals am gleichen Tag ausgeführt wird. Dann sollen die restlichen Codezeilen auch ausgeführt werden. Deswegen habe ich mich für die Zeilenvariante der If-Struktur entschieden.

Dim Jahr,Monat,Tag,Datum,fso,args,x,foname,pfad
Set fso = CreateObject("Scripting.FileSystemObject")
pfad="X:\Papierkorb"
Set args=WScript.Arguments
Jahr=Year(Date)
Monat=Month(Date)
Tag=Day(Date)
Datum=Jahr & "-" & Monat & "-" & Tag
If Not fso.FolderExists(pfad & "\" & Datum) Then fso.CreateFolder(pfad & "\" & Datum)
For Each x in args
   	If fso.FolderExists(x) Then
   		foname=fso.GetFolder(x).Name
   		fso.CopyFolder x, pfad & "\" & Datum & "\" & foname
   		fso.DeleteFolder x
   	End If
Next




Vielen Dank für den Hinweis mit Copy/Delete!!

Ich wünsche dir einen schönen Abend!!

Viele Grüße, je77
0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.681
  • Beigetreten: 20. Juli 07
  • Reputation: 1.075

geschrieben 30. Oktober 2018 - 17:54

Okay, die exakte Programmlogik hab ich jetzt natürlich nicht angeschaut. :)

Mich wundert eher, daß der das bei Dir annimmt. "Für mich™" gehört End If immer dazu, egal wie viele Zeilen das sind... gut, wenn es nicht nötig ist, dann ist es nicht nötig.


Ich würd aber dennoch dringend anraten, das End If hinzuschreiben, wenn man irgendwo "If"t. Einfach deswegen, weil man ohne das End If ggf eher rumsucht, wo denn jetzt der Block zu Ende sein soll.

If condition Then statement End If funktioniert genauso wie mit noch einem Else-Zweig (If condition Then statement Else alt_statement End If) und dann sieht man gleich was los ist.


Und die obligatorische Anmerkung: MS will VB und vBS gerne mausetot haben, wenn Du also was für "länger" brauchst, weich auf JScript oder ggf. PowerShell aus. PS wär einfacher, aber ich tu mich ein bissel schwerer damit, das zu empfehlen, weil MS das schon wieder alles übern Haufen gekippt hat.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#5 Mitglied ist offline   je77 

  • Gruppe: aktive Mitglieder
  • Beiträge: 25
  • Beigetreten: 25. Januar 18
  • Reputation: 0

geschrieben 30. Oktober 2018 - 18:14

Hallo RalphS,

den Hinweis mit dem End if werde ich beherzigen.
Ich habe mir schon ein Buch über Powershell besorgt - um gewappnet zu sein.
Momentan habe ich noch nicht die Zeit es zu lernen.

Schönen Abend...

je77
0

#6 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.049
  • Beigetreten: 14. August 15
  • Reputation: 228

geschrieben 30. Oktober 2018 - 21:38

In VB (auch VBScript oder VBA) kann man das End If weglassen bzw. wird es als Syntaxerror erkannt, wenn alles in einer Zeile steht.

If <Bedingung> Then
   <tu dies>
End If

ist das gleiche wie die kurze Form

If <Bedingung> Then <tu dies>

AMD Ryzen 2700X, Asus TUF X470-Plus Gaming, 2x8GB Corsair DDR4-3200, Asus Geforce GTX 1060 6GB, 1x 120GB Intenso SSD, 1x 1TB Sandisk SSD, Win10 Home 64Bit
0

#7 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.681
  • Beigetreten: 20. Juli 07
  • Reputation: 1.075

geschrieben 30. Oktober 2018 - 22:59

Dann mach ich was falsch, weil bei mir ist
If condition Then statement End If

ein gültiges Konstrukt, geht beim Interpreter durch und funktioniert.

Allerdings ist MS immer noch ein wenig inkonsequent, denn auf einer Zeile wollen die dann plötzlich Klammern, wenn man eine Subroutine aufruft, wo sie in allen anderen Fällen über eben jene Klammern meckern.

Meh. Ist VBScript, was will man da erwarten.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#8 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.049
  • Beigetreten: 14. August 15
  • Reputation: 228

geschrieben 31. Oktober 2018 - 14:47

Beitrag anzeigenZitat (RalphS: 30. Oktober 2018 - 22:59)

Dann mach ich was falsch, weil bei mir ist
If condition Then statement End If

ein gültiges Konstrukt, geht beim Interpreter durch und funktioniert.

Wenn ich das in VStudio 2017 eintipper, wird das End rot hinterlegt und als falsch angesehen.

Eingefügtes Bild

Als Fehlermeldung kommt dann "BC30205 end of-Anweisung erwartet.
AMD Ryzen 2700X, Asus TUF X470-Plus Gaming, 2x8GB Corsair DDR4-3200, Asus Geforce GTX 1060 6GB, 1x 120GB Intenso SSD, 1x 1TB Sandisk SSD, Win10 Home 64Bit
0

#9 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.681
  • Beigetreten: 20. Juli 07
  • Reputation: 1.075

geschrieben 31. Oktober 2018 - 15:55

VB.NET <> VBS. VS2017 versteht VBS nicht (mehr) gut genug, um Fehler zu erkennen. Werd nochmal bei VB.NET gucken, aber:

Z:\>md testpfad a  b c

Z:\>cscript test-script.vbs a b c
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.


Z:\>type test-script.vbs
Option Explicit

Function LPad(strInput, strPadChar, iPadLength)
Dim output: output = ""
Dim tmp: tmp = ""

Dim i: For i = 0 To iPadLength -1
tmp = tmp & Cstr(strPadChar)
Next
output = Right(tmp &strInput, iPadLength)
LPad = output
End Function

Dim Datum,x,foname
Dim fso  : Set fso   = CreateObject("Scripting.FileSystemObject")
Dim Pfad :     pfad  = "z:\testpfad"
Dim args : Set args  = WScript.Arguments
Dim dtJetzt: dtJetzt = Now()

Dim Jahr :     Jahr  = Year(dtJetzt)
Dim Monat:     Monat = Month(dtJetzt)
Dim Tag  :     Tag   = Day(dtJetzt)


Datum = LPad(Jahr,0, 4) & "-" & LPad(Monat,0, 2) & "-" & LPad(Tag,0,2)

'*** hier die fragliche Zeile ***
If Not fso.FolderExists(pfad & "\" & Datum) Then fso.CreateFolder pfad & "\" & Datum End If


    For Each x in args
        If fso.FolderExists(x) Then
'            foname = Mid(x,InStrRev(x,"\")+1)
            foName = fso.GetFolder(x).Name
            MsgBox foname
            fso.MoveFolder x, pfad & "\" & Datum & "\" & foname
        End If
    Next

'EOF

Z:\>dir testpfad /A/S/B
Z:\testpfad\2018-10-31
Z:\testpfad\2018-10-31\a
Z:\testpfad\2018-10-31\b
Z:\testpfad\2018-10-31\c
Z:\>





Wenn ich was dermaßen ungetestetes poste, daß ich selber nicht weiß, ob es überhaupt erstmal ausführbar ist, dann schreib ich das dazu.


##

Okay, VBNET will Doppelpunkte, wenn man End If anhängen will: If condition Then: statement: End If

Ändert natürlich nichts daran, daß man schon ein bissel Disziplin haben sollte und seine Bedingungen als solche *klar* erkennbar halten sollte. Dazu gehört, daß man sie terminiert, und erkennbar terminiert; nicht nur in VB, sondern überall.

Nur weil ich was weglassen kann, heißt das nicht, daß das gut ist, und Bedingungen sind Kontrollstrukturen, die mir sagen, welcher Code wann ausgeführt werden soll. Wenn ich das selber nicht mehr mitkriege, dann hab ich ein Problem.

Dieser Beitrag wurde von RalphS bearbeitet: 31. Oktober 2018 - 16:17

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#10 Mitglied ist offline   Gispelmob 

  • Gruppe: aktive Mitglieder
  • Beiträge: 2.049
  • Beigetreten: 14. August 15
  • Reputation: 228

geschrieben 31. Oktober 2018 - 17:17

Das Problem sehe ich eher darin, dass MS seinen Programmiersprachen keinen Gefallen tut, wenn sie solche (verkürzte) Syntax a) zulassen und b) dann noch als korrekt handhaben. Dann wird man als Programmierer nämlich dazu verleitet, sowas als gegeben und als Standard anzunehmen.

Ich werd mal schauen, dass ich die If-End If Blöcke in Zukunft immer mehrzeilig schreibe und die verkürzte Version vermeide.
AMD Ryzen 2700X, Asus TUF X470-Plus Gaming, 2x8GB Corsair DDR4-3200, Asus Geforce GTX 1060 6GB, 1x 120GB Intenso SSD, 1x 1TB Sandisk SSD, Win10 Home 64Bit
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0