komoran12
Goto Top

If exist - if not exist in .vbs - Datei

Moin, moin,

vielleicht hat jemand ja einen Tipp für mich. Mit nachfolgender .vbs lasse ich mir einen Messagebox ausgeben:

msgbox"Konvertierung abgeschlossen!" & vbCrLf & "" & vbCrLf & "Konvertierung abgeschlossen! ",64,"Konvertierung abgeschlossen!"  

Allerdings würde ich jetzt gerne diese nur ausgeben lassen, wenn ich einem bestimmten Verzeichnis (%userprofile%\Temp) .txt Dateien liegen.

Jetzt dachte ich daran, es wie folgt zu lösen:

set quelle=%userprofile%\Temp\*.txt
if exist "%quelle%"  goto :test  
if not exist ""%quelle%"" goto :EOF  
:test
msgbox"Konvertierung abgeschlossen!" & vbCrLf & "" & vbCrLf & "Konvertierung abgeschlossen! ",64,"Konvertierung abgeschlossen!"  

Allerdings funktioniert das leider nicht! Hat jemand eine Idee, dass anders zu lösen?

Beste Grüße!

Content-Key: 346063

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

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

Member: emeriks
emeriks Aug 11, 2017 updated at 13:09:15 (UTC)
Goto Top
Hi,
na ja, man kan nicht einfach so Batch nach VBscript "kopieren". Bei Powershell mag das ja z.T. noch gehen.

1. Syntax lautet "if ... then ..."
2. Die Existenz mehrerer Dateien kann man eh so nicht abfragen. Das machst Du in VBscript z.B. mit Scripting.FileSystemObject.

So etwa
dim WshShell : set WshShell = CreateObject("Wscript.Shell")  
dim FSO : set FSO = CreateObject("Scripting.FileSystemObject")  
dim Path : Path = WshShell.ExpandEnvironmentStrings("%userprofile%") & "\Temp"  
dim File
for each File in FSO.GetFolder(Path).Files
  if lcase(right(File.Name,4)) = ".txt" then  
    msgbox "Konvertierung abgeschlossen!" & vbCrLf & "" & vbCrLf & "Konvertierung abgeschlossen! ",64,"Konvertierung abgeschlossen!"  
    exit for
  end if
next

E.
Member: em-pie
em-pie Aug 11, 2017 updated at 13:45:11 (UTC)
Goto Top
Moin,

dein Problem ist, dass du Batch und vbs vermischt:
Du versuchst die Variable quelle mit %-Zeichen anzusprechen.
Dass Variablen via %-Zeichen angesprochen werden, ist jedoch eine Terminologie des Batch-Scriptings

Genauso wie das Zuweisen einer Variable.

Klassischerweise funktioniert das Zuweisen und "Abrufen" wie folgt:
'Deklarieren  
DIM strVar

'Zuweisen  
strVar = "Meine Variable"  

'Verwenden:  
wscript.echo strVar

um zu prüfen, ob Dateien zunächst vorhanden sind, schaue dir mal die Methode GetFolder an.

Hier kannst du dann z.B. für jede Datei prüfen (mittels for each objFile in objGetFolders), ob die Extension "txt" entspricht und einen Zähler hochlaufen lassen.
Ist deiner Counter >0, dann lässt du die msgbox "anspringen"...

Hilfen findest du hier:
https://msdn.microsoft.com/de-de/library/f1xtf7ta(v=vs.84).aspx
http://www.vbsedit.com/html/867057a0-50cf-4613-84be-28bf908b23a7.asp
https://stackoverflow.com/questions/4200028/vbscript-list-all-pdf-files- ...
https://stackoverflow.com/questions/6759299/check-to-see-if-any-file-exi ...

Gruß
em-pie

€dit: Typo &

Emeriks Variante bedeutet, dass du bei jeder vorhandenen *.txt-Datei eine msgbox erhälst, bei 3000-Dateien also 3000 Msg-Boxen...

€dit2: Gestrichenes erklärt sich unten!
Member: emeriks
emeriks Aug 11, 2017 at 13:15:47 (UTC)
Goto Top
Emeriks Variante bedeutet, dass du bei jeder vorhandenen *.txt-Datei eine msgbox erhälst, bei 3000-Dateien also 3000 Msg-Boxen...
Nein, bedeutet sie nicht!
Member: beidermachtvongreyscull
beidermachtvongreyscull Aug 11, 2017 at 13:41:42 (UTC)
Goto Top
Zitat von @em-pie:
Emeriks Variante bedeutet, dass du bei jeder vorhandenen *.txt-Datei eine msgbox erhälst, bei 3000-Dateien also 3000 Msg-Boxen...

Wenn Du Zeile 8 und Zeile 9 von @emeriks Code anschaust, siehst Du es.
Trifft die if-Abfrage zu wird in Zeile 8 die for-Schleife schon wieder verlassen.
Die msgbox kommt also nur einmal auf bei der ersten gefundenen txt-Datei.
Member: em-pie
em-pie Aug 11, 2017 at 13:44:08 (UTC)
Goto Top
jo... ihr habt recht, das exit for habe ich glattweg überlesen...
Verzeiht mir bitte!
Member: emeriks
emeriks Aug 11, 2017 at 14:08:17 (UTC)
Goto Top
Verzeiht mir bitte!
Niemals!
Member: Komoran12
Komoran12 Aug 11, 2017 at 14:26:26 (UTC)
Goto Top
Zitat von @emeriks:

Hi,
na ja, man kan nicht einfach so Batch nach VBscript "kopieren". Bei Powershell mag das ja z.T. noch gehen.

1. Syntax lautet "if ... then ..."
2. Die Existenz mehrerer Dateien kann man eh so nicht abfragen. Das machst Du in VBscript z.B. mit Scripting.FileSystemObject.

So etwa
> dim WshShell : set WshShell = CreateObject("Wscript.Shell")  
> dim FSO : set FSO = CreateObject("Scripting.FileSystemObject")  
> dim Path : Path = WshShell.ExpandEnvironmentStrings("%userprofile%") & "\Temp"  
> dim File
> for each File in FSO.GetFolder(Path).Files
>   if lcase(right(File.Name,4)) = ".txt" then  
>     msgbox "Konvertierung abgeschlossen!" & vbCrLf & "" & vbCrLf & "Konvertierung abgeschlossen! ",64,"Konvertierung abgeschlossen!"  
>     exit for
>   end if
> next
> 

E.

Hi emeriks,

genau sowas habe ich gesucht und versucht, vielen Dank, ich werde es gleich mal direkt testen.

Kann ich das so anpassen, dass er die Messagebox nur ausgibt, wenn nur bestimmte .txt Dateien vorhanden sind?
Alles eine .txt Datei die zu einem mit convert.... anfängt und die zweite die mit complete... anfängt.
Member: emeriks
emeriks Aug 11, 2017 updated at 14:30:52 (UTC)
Goto Top
Kann ich das so anpassen, dass er die Messagebox nur ausgibt, wenn nur bestimmte .txt Dateien vorhanden sind?
Ja.
Alles eine .txt Datei die zu einem mit convert.... anfängt und die zweite die mit complete... anfängt.
Kann ich nicht beantworten. Ich verstehe den Text nicht.
Member: Komoran12
Komoran12 Aug 11, 2017 at 14:38:38 (UTC)
Goto Top
Sorry - die es gibt 2 .txt Dateien die vorhanden sein sollen, um die Message auszugeben.

1. txt -> convert-18.09.52.txt
2. txt -> complete-18.09.54.txt

Hierbei soll er halt convert und complete nur als variable nehmen.
Member: emeriks
emeriks Aug 11, 2017 at 14:44:37 (UTC)
Goto Top
Na dann baue das so ein.
if lcase(left(File.Name,7)) = "convert" and lcase(right(File.Name,4)) = ".txt" then   
Member: Komoran12
Komoran12 Aug 11, 2017 at 14:51:51 (UTC)
Goto Top
Zitat von @emeriks:

Na dann baue das so ein.
> if lcase(left(File.Name,7)) = "convert" and lcase(right(File.Name,4)) = ".txt" then   
> 

Ok, vielen Dank. Wie ist es, wenn hier ein "und" habe möchte?

if lcase(left(File.Name,7)) = "convert" and lcase(right(File.Name,4)) = ".txt" and  
if lcase(left(File.Name,7)) = "complete" and lcase(right(File.Name,4)) = ".txt"  
then 
Member: emeriks
emeriks Aug 11, 2017 at 15:14:47 (UTC)
Goto Top
Wieso "und"? "Oder" !
Und ein Bißchen Lesen und learning by doing ist nichts für Dich?
Member: Komoran12
Komoran12 Aug 12, 2017 at 10:23:07 (UTC)
Goto Top
Das mit "or" hatte ich verstanden, aber ich wollte gerne das beides erfüllt sein muss. Daher das "und" face-smile
Member: emeriks
Solution emeriks Aug 12, 2017 at 13:24:18 (UTC)
Goto Top
Achso. die Message soll nur einmal kommen und das nur dann, wenn diese beiden Datein gleichzeitig vorhanden sind?
Nach dann überlege mal selbst ob man das mit der Überprüfung des Namens einer Datei hinbekommen könnte?
Du willst weder
"Wenn jemand anwesend ist, der/die Paul und Tina heißt, dann bitte melden."
noch
"Wenn jemand anwesend ist, der/die Paul oder Tina heißt, dann bitte melden."
sondern
"Wenn jemand anwesend ist, der Paul heißt, und dann noch jemand, die Tina heißt, dann bitte melden."
Du musst also durch den Raum gehen und Dir merken, ob Du Paul oder Tina schon getroffen hast.
dim WshShell : set WshShell = CreateObject("Wscript.Shell")  
dim FSO : set FSO = CreateObject("Scripting.FileSystemObject")  
dim Path : Path = WshShell.ExpandEnvironmentStrings("%userprofile%") & "\Temp"  
dim File, ConvertExist, CompleteExist
ConvertExist = False
CompleteExist = False
for each File in FSO.GetFolder(Path).Files
    if lcase(left(File.Name,7)) = "convert" and lcase(right(File.Name,4)) = ".txt" then  
      ConvertExist = True
    end if  
    if lcase(left(File.Name,8)) = "complete" and lcase(right(File.Name,4)) = ".txt" then  
      CompleteExist = True
    end if  
    if ConvertExist and CompleteExist then
        msgbox "Konvertierung abgeschlossen!" & vbCrLf & "" & vbCrLf & "Konvertierung abgeschlossen! ",64,"Konvertierung abgeschlossen!"  
    exit for
  end if
next
Member: Komoran12
Komoran12 Aug 14, 2017 at 13:03:58 (UTC)
Goto Top
Hallo emeriks, vielen Dank für Deine Hilfe.
Das funktioniert soweit alles sehr gut - danke.

Wenn ich die Dateinamen jetzt anpasse, will es irgendwie nicht funktionieren.

dim WshShell : set WshShell = CreateObject("Wscript.Shell")  
dim FSO : set FSO = CreateObject("Scripting.FileSystemObject")  
dim Path : Path = WshShell.ExpandEnvironmentStrings("%userprofile%") & "\Temp"  
dim File, ConvertExist, CompleteExist
ConvertExist = False
CompleteExist = False
for each File in FSO.GetFolder(Path).Files
    if lcase(left(File.Name,7)) = "convert" and lcase(right(File.Name,4)) = ".txt" then  
      ConvertExist = True
    end if  
    if lcase(left(File.Name,8)) = "complete" and lcase(right(File.Name,4)) = ".txt" then  
      CompleteExist = True
    end if  
    if ConvertExist and CompleteExist then
        msgbox "Konvertierung abgeschlossen!" & vbCrLf & "" & vbCrLf & "Konvertierung abgeschlossen! ",64,"Konvertierung abgeschlossen!"  
    exit for
  end if
next

Ich habe jetzt Zeile 8 mit test1 und Zeile 11 mit test2 bei mir angepasst - allerdings dann funktioniert es nicht. face-sad
Member: emeriks
emeriks Aug 14, 2017 updated at 13:17:41 (UTC)
Goto Top
Ja ist logisch.
Hast Du Dir auch nur einmal die Befehle angesehen, was diese machen und warum da welche Parameter stehen? Ein Bißchen Initiative?

lcase
left
right
Member: Komoran12
Komoran12 Aug 14, 2017 at 13:23:06 (UTC)
Goto Top
Ja, das habe ich, aber irgendwie will das nicht so, wie ich es will face-sad
Muss ggf. Zeile 9,12,14 ebenfalls angepasst werden?
Member: beidermachtvongreyscull
beidermachtvongreyscull Aug 14, 2017 at 13:26:27 (UTC)
Goto Top
Hast Du denn den Code zwischen den Zeilen 7 und 14 überhaupt verstanden?
Member: emeriks
Solution emeriks Aug 14, 2017 at 13:27:52 (UTC)
Goto Top
Ja, das habe ich, aber irgendwie will das nicht so, wie ich es will face-sad
Muss ggf. Zeile 9,12,14 ebenfalls angepasst werden?
Ja. Z.B. in 9 könntest Du schreiben "noch trueer"

Mal im Ernst:
Ja, das habe ich
Was machen die von mir fett geschriebenen Funktionen? Wenn Du mir diese Frage beantworten kannst, dann helfe ich weiter.
Member: beidermachtvongreyscull
beidermachtvongreyscull Aug 14, 2017 at 13:35:45 (UTC)
Goto Top
OK.

Ich bin raus, denn jetzt wird's bescheuert.
Member: Komoran12
Komoran12 Aug 17, 2017 at 15:10:04 (UTC)
Goto Top
Zitat von @emeriks:

Ja ist logisch.
Hast Du Dir auch nur einmal die Befehle angesehen, was diese machen und warum da welche Parameter stehen? Ein Bißchen Initiative?

lcase
left
right

Hi emeriks, hat lcase ggf. etwas mit der länge des Wortes zu tun? Irgendwie steige ich da nicht durch, würde es aber gerne wissen.
Member: em-pie
em-pie Aug 17, 2017 at 17:43:49 (UTC)
Goto Top
Hast du mal nach den Funktionen
Left()
Right()
Lcase()
UCase()
Im Zusammenhang mit vbs geschaut?

Wenn wenn ja, wirst du obigen Code und deinem String test_.txt verstehen.

Was macht denn ein Right("test_.txt", 4)?
Member: Komoran12
Komoran12 Aug 18, 2017 at 11:10:18 (UTC)
Goto Top
Zitat von @em-pie:

Hast du mal nach den Funktionen
Left()
Right()
Lcase()
UCase()
Im Zusammenhang mit vbs geschaut?

Wenn wenn ja, wirst du obigen Code und deinem String test_.txt verstehen.

Was macht denn ein Right("test_.txt", 4)?

Hallo em-pie, ich konnte mich da jetzt endlich einlesen und habe es verstanden...

Wenn ich hier:

if lcase(left(File.Name,7)) = "convert" and lcase(right(File.Name,4)) = ".txt" then   

anstatt convert.txt - test123.txt habe, muss ich es wie folgt anpassen:

if lcase(left(File.Name,8)) = "test1234" and lcase(right(File.Name,4)) = ".txt" then   
Member: emeriks
emeriks Aug 18, 2017 at 11:15:59 (UTC)
Goto Top
Geht doch.