VBS/WSH - Leerzeichen in Ordner-(und Datei?!)-namen

cumulonimbus8

Fleet Admiral
Registriert
Apr. 2012
Beiträge
19.047
Hallo!

Code:
Dim WSHShell
Set WSHShell = WSCRIPT.CreateObject("WScript.Shell")
WshShell.Run "W:\Aktion G\ED\EDStep.bat", 2, True
♪ Klingeling: »Datei nicht gefunden, Zeile 3, Spalte 1; 80070002«

Also sucht man seine Aufzeichnungen durch…
→ WshShell.Run """W:\Aktion G\ED\EDStep.bat""", 2, True
Das 3-fache " soll helfen. Hats auch mal. Hilft aber heute nicht! Wieder 80070002. Pfade und Files existieren ohne Zweifel. Was ist hier denn nun schon wieder im Eimer? Wie kriegt man so was Simples wie Leerzeichen in Pfaden geregelt?

CN8
 
In den meisten Programmiersprachen mit etwas, das übergreifend funktioniert, nämlich der hexadezimalen Angabe des ASCII-Wertes des zu escapenden Zeichens. Beispiel \x20 für das Leerzeichen in hex.

Wenn’s das nicht tut, eine Suchmaschine deiner Wahl mit vbs escape leerzeichen quälen.
 
Du könntest die folgende VBA Prozedur ausprobieren:

Declare Function OpenProcess _
Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Declare Function WaitForSingleObject _
Lib "kernel32.dll" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Declare Function CloseHandle _
Lib "kernel32.dll" (ByVal hObject As Long) As Long

'-------------------------------------------------------------------------------------'
' Prozedur: ShellExecute
'
' Beschreibung: Führt das übergebene Befehlsskript aus. Die Programmausführung wird
' bis zur Beendigung des Befehlsskripts unterbrochen.
'
' Parameter: strcmdLine
'-------------------------------------------------------------------------------------'
Public Sub ShellExecute(ByVal strCmdLine As String)
On Error GoTo ShellExecute_Error
Const conSynchronize = &H100000
Dim lngProcessID As Long
Dim lnghWnd As Long
Dim lngRetVal As Long
lngProcessID = Shell(strCmdLine, vbHide)
If lngProcessID <> 0 Then
lnghWnd = modPublDecl.OpenProcess(conSynchronize, _
0&, _
lngProcessID)
Do
lngRetVal = modPublDecl.WaitForSingleObject(lnghWnd, _
0)
Loop Until lngRetVal <> 258
lngRetVal = modPublDecl.CloseHandle(lnghWnd)
End If
ShellExecute_Exit:
Exit Sub
ShellExecute_Error:
Resume ShellExecute_Exit
End Sub


Viel Spaß
 
Wenn Du eine batch starten willst, brauchst Du den Kommandozeileninterpreter.

Dim WSHShell
Set WSHShell = WSCRIPT.CreateObject("WScript.Shell")
WshShell.Run "cmd /K ""W:\Aktion G\ED\EDStep.bat""", 2, True
 
Brate mir einen einen Storch, aber der Code ist älter und es ging immer ohne CMD direkt zu bemühen… Hmm… Man müsste probieren was mit dieser Zwischeninstanz geschieht.

@ella_one
Der Code erinnert mich instinktiv an «ShellX» wie ich es unter VBA einsetze. Ich hätte keine Sorge, dass der VBS-Code weiterläuft und sich mit der Zeile selbst beendet. Aber notieren werde ich mir das mal.
(Ich starte diese VBS per Aufgabenplanung, wohl eine Altlast weil ich BAT-Files mit dem Scheduler unter XP nie richtig an die Arbeit bekam. Batch ist für das was zu tun ist die bessere Sprache den VBS, komischerweise).

@DeusoftheWired (1)
Das Konzept kenne ich natürlich. Aber er grätzt mich an wenn MS mit primitiven Anforderungen einen so im Regen stehen lässt.

@DeusoftheWired (2)
Ich wäre niemals nicht auf die Idee gekommen nach «vbs escape leerzeichen» zu suchen, wenn ich auch mit dem Begriff Escape-Sequenz vertraut bin… Zu blöd zum Suchen halt.
 
Das klappt alles nicht…

Skript: W:\AKTION-G\EDStepT.VBS
Zeile: 3
Zeichen: 1
Fehler: Das System kann die angegebene Datei nicht finden.
Code: 80070002
Quelle: (null)

Code:
Dim WSHShell
Set WSHShell = WSCRIPT.CreateObject("WScript.Shell")
WshShell.Run """c:\windows\system32\cmd.exe /k W:\Aktion L\ED\EDStepT.bat""", 1, True
3 Anführungszeichen, die Batch per CMD aufzurufen - nichts, garnichts. Ich kann nichts organisieren das Leerzeichen zu maskieren, auch schnöde Chr(32) einzustreuen beeindruckt VBS nicht die Bohne…

In seltsamen Verteilungen der " wird immerhin CMD aufgerufen um direkt zu melden, dass «die Datei W:\Aktion nicht gefunden werden könnte».

Man muss doch der Leerzeichen in Pfadnamen Herr werden können..!
Was will man denn tun wenn man Pfadnamen nicht anfassen kann oder solche Leer-Werte irgendwoher bekommt (aus Datei eingelesen von mir aus)?

CN8



Code:
Dim WSHShell
Set WSHShell = WSCRIPT.CreateObject("WScript.Shell")
Dim LW, Datei, ArbO, ArbD
Set FSO = CreateObject("Scripting.FileSystemObject")
LW = "W:"
ArbO = "AKTION L"
For Each Datei In FSO.GetFolder(LW & "\" & ArbO).Files
 If FSO.GetExtensionName(Datei) = "bat" Then ArbD = Datei.Path
Next
WshShell.Run "c:\windows\system32\cmd.exe /k " & ArbD, 1, True
Auch hier wo ich Dateiname und Pfad direkt aus Rückgabedaten erfasse kommt der Unfall, dass diese Datei nicht gefunden würde.
 
Zuletzt bearbeitet:
Was hast Du denn für ein Betriebssystem?

Ich habe es auf Windows 10 64 getestet mit folgenden Daten (Laufwerksbuchstabe dürfte egal sein:

Script:
Dim WSHShell
Set WSHShell = WSCRIPT.CreateObject("WScript.Shell")
WshShell.Run "cmd /K ""R:\Test a\Test.bat""", 2, True

Datei R:\Test a\Test.bat
echo "Test"
pause
Ergänzung ()

Hier mal mit einem Parameter:
Script:
Dim WSHShell
Set WSHShell = WSCRIPT.CreateObject("WScript.Shell")
WshShell.Run "cmd /K """"R:\Test a\Test.bat"" ""Huhu Huhu""""", 2, True

Batch:
 
Zuletzt bearbeitet:
Das muss ich mir noch mal in Ruhe antun… Betriebssystem ist 10-64.

Mich wurmt, dass ich eine Syntax extra als funktionierend notiert hatte die nun nicht tut.

CN8
 
Hat es inzwischen jemand rausgefunden wie man das Thema umgehen kann :) ich steh nämlich vor dem gleichen Problem :(
 
Zurück
Oben