evinben
Goto Top

Windows Script Host (vbs-Skript) verarbeitet den variablen Pfad nicht korrekt

Hallo,

etwas sehr seltsamen:

Folgendes vbs-Script wird auf einem Rechner mit ausgeschalteter Kontensteuerung korrekt ausgeführt, aber auf einem anderen - allerdings mit eingeschalteter Kontensteuerung mit administrativen Rechten - nicht korrekt ausgeführt (beides unter Windows 7).
Set objShell=WScript.CreateObject("Wscript.Shell")  
Set objShortcut=objShell.CreateShortcut("%UserProfile%\Desktop\VHD.lnk")  
objShortcut.TargetPath="G:\"  
objShortcut.Description="Alt"  
objShortcut.Save
Beim Ausführen wird jeweils diese Fehlermeldung generiert:

cd49df98b9f51f052c4e429a6d18c0c6

Hier ist es klar zu sehen, dass Windows Script Host bei der Verarbeitung des Skriptes vor der Variable %UserProfile% seltsamerweise den Pfad des Verzeichnisses einfügt, von welchem aus diese vbs-Skriptdatei ausgeführt wird.
Wird das Skript von einem Verzeichnis etwa wie D:\Dokumente\VBS-Skript ausgeführt, dann würde der intern tatsächlich verarbeitete Pfad in der Fehlermeldung so aussehen:
D:\Dokumente\VBS-Skript\%UserProfile%\Desktop
Wird der variable Pfad %UserProfile%\Desktop in dem Windows Explorer 1:1 manuell eingetippt, dann gelangt es problemlos zu dem Verzeichnis.
Wird der direkte Pfad zu dem Verzeichnis – also ohne Variable - in dem Skript wie folgt eingetragen
C:\Users\Administrator\Desktop\VHD.lnk
funktioniert das Skript dann und eine Verknüpfung wird dort erstellt.


Ich hatte zuerst die Vermutung, dass die entsprechenden Variablen in dem System ungewollt verändert wurden, das kann andererseits mit dem genannten Beispiel oben doch nicht der Fall sein!?
Diese Krankheit ist mir ein großes Rätsel.
So wie ich es stark spüre, habt Ihr bestimmt eine Erklärung und eine Lösung hierfür.

PS: Auf dem Rechner mit der aktiven Kontensteuerung sind nur ein Office 2007 Paket und vier andere Programme drauf, die ich beruflich monatelang benutze. Windows ist inkl. allen Updates auf dem neuesten Stand.

Danke sehr!

Gruß
evinben

Content-Key: 181668

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

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

Member: Skyemugen
Skyemugen Mar 08, 2012 at 12:32:01 (UTC)
Goto Top
Aloha,

entschuldige aber .. 2 Sekungen gegoogelt ... nach %userprofile% vbs und du hättest deine Lösung ...

greetz André

@peter, da würde er in Fund #1 bei google drauf stoßen face-wink
Member: Pjordorf
Pjordorf Mar 08, 2012 at 12:47:40 (UTC)
Goto Top
Hallo,

... nach environmet variable vbs und du hättest die Geschichte dahinter ...

Gruß,
Peter
Member: evinben
evinben Mar 08, 2012 at 19:32:39 (UTC)
Goto Top
Hallo ihr beide,

danke euch sehr für den Tipp. Ich kann mir es immer noch nicht erklären, warum das Skript auf einem Rechner ohne Kontensteuerung problemlos läuft – also die Umgebungsvariablen erkennt - und auf dem anderen nicht.
So wie ich es verstanden habe, soll generell mit der Methode ExpandEnvironmentStrings gearbeitet werden, die eine Umgebungsvariable ausliest, dann in dem Skript in weiterem Schritt den ausgelesenen Pfad in einer neuen Variable setzen, anstatt die Umgebungsvariable direkt z. B. als %UserProfile% einzugeben. Dann ist es ein Wunder, dass das Skript auf dem einen Rechner überhaupt funktioniert, wenn ich es richtig verstehe?
Nach meinen vielen Versuche habe ich es dennoch nicht geschafft den folgenden Code, der nun mit der Methode ExpandEnvironmentStrings ergänzt wurde, zum Laufen zu bringen, daher freue ich mich sehr über eure Hilfe:
Set objShell=WScript.CreateObject("Wscript.Shell")  
sUserProfile = objShell.ExpandEnvironmentStrings("%UserProfile%")  
Set objShortcut=objShell.CreateShortcut(sUserProfile &"\Desktop\VHD.lnk")  
objShortcut.TargetPath="G:\"  
objShortcut.Description="Alt"  
objShortcut.Save
Sobald oben „\Desktop“ rausgenommen wird, läuft das Skript wie gewollt richtig. Die Verknüpfung muss allerdings auf den Desktop natürlich.
Wenn nach paar Stunden es nicht zu schaffen ist, dann lasse ich es einfach sein. Das ist nicht mehr lustig.

Gruß
evinben
Member: bastla
bastla Mar 08, 2012 at 20:16:18 (UTC)
Goto Top
Hallo evinben!

Da gäbe es ja dann noch die Alternative "SpecialFolders" - also etwa:
Set objShortcut=objShell.CreateShortcut(objShell.SpecialFolders("Desktop") & "\VHD.lnk")
Grüße
bastla
Member: evinben
evinben Mar 08, 2012 at 21:26:59 (UTC)
Goto Top
Hallo bastla,

ein Wahnsinn!
Wie hätte ich ohne euch solche ausgefallene Probleme lösen können?
Gebe es überhaupt eine Methode, die so einen Pfad mit einem „speziellen“ Ordner, wie hier namens Desktop, verarbeiten kann?

C:\Users\Administrator\Desktop\VHD.lnk

So wäre es natürlich viel einfacher mal einen Pfad ohne den „speziellen“ Ordner oder mal einen Pfad mit solchen !„problematischen“ ! zu übergeben.
Es ist unnötig kompliziert. Im Batch ist es viel-viel einfacher – zumindest von meiner jetzigen Sicht ;)?

Danke !!!
Member: bastla
bastla Mar 08, 2012 at 21:35:53 (UTC)
Goto Top
Hallo evinben!

Sorry - ich verstehe Deine Frage nicht ...

Welche "SpecialFolders" verfügbar sind, kannst Du jedenfalls hier nachlesen ...

Grüße
bastla
Member: evinben
evinben Mar 08, 2012 at 22:05:59 (UTC)
Goto Top
Hallo @bastla!

hmm… sorry ebenso - ich versuche es gerne nochmal:
So einen Pfad 1:1
C:\Users\Administrator\Desktop\VHD.lnk
kann das Skript nicht verarbeiten. Der Pfad muss zerlegt, gereinigt und in zwei solche Argumente aufgespaltet werden: ..."Desktop" &"\\VHD.lnk.... Erst dann funktioniert es endlich.
Wenn ich allerdings auf die gleiche Skript-Vorlage zugreife und einen anderen Pfad übergebe, etwa wie
C:\Users\Administrator\Desktop\VHD.lnk
dann muss ich wieder basteln… face-sad

Gebe es wohl keine Methode, bei welcher egal was für einen Pfad übergeben wird (also ohne Variable – soweit habe ich es akzeptiert) sie diesen einfach verarbeitet? Also so einen wie oben und so einen wie folgt:
C:\Users\Administrator\Backup\VHD.lnk

?
Member: Pjordorf
Pjordorf Mar 08, 2012 at 22:20:06 (UTC)
Goto Top
Falsche Baustelle.

Peter

[Nachtrag]
Diese Antwort ist nicht für diese Baustelle bestimmt gewesen.
[/Nachtrag]
Member: evinben
evinben Mar 08, 2012 at 22:27:15 (UTC)
Goto Top
Hallo Peter,

was meinst du damit? Geht es nicht?

gruß
evinben
Member: evinben
evinben Mar 09, 2012 at 03:28:16 (UTC)
Goto Top
Problem gelöst!

Es hat mit der Kontensteuerung nicht zu tun, wie es mit der obigen Konstellation doch zu vermuten wäre.
Da der Pfad von Shell Objects „Desktop“ auf dem Rechner, auf welchem das Skript nicht funktionierte, verschoben wurde und der Desktop-Quellordner sich physikalisch irgendwo ganz anders befindet, verkraftete Windows es intern nicht. Diese Einstellung muss allerdings so bleiben wie sie ist, da dieser Desktop-Ordner mit anderen Windows-Installationen sich mitteilt.
Nach Eingabe von %UserProfile%\Desktop in im Windows Explorer gelangt man zwar sofort ans Ziel, gibt man das Gleiche aber in der Eingabeaufforderung ein, stellt man fest, dass das Verzeichnis nicht existiert/verknüpft und sonstiges….

Die Problemlösung heißt „Symbolische Verknüpfung“.

Mit dem folgenden Befehl
mklink /d "%UserProfile%\Desktop" "D:\Dok\Desktop"  
eine symbolische Verknüpfung zu dem Desktop-Ordner erstellen und das Problem ist für immer weg.

@bastla sorry für meine Frage nach einer „neuen“ Methode, die eigentlich in dem Skript die ganze Zeit war:
Da ich bei diesem Problem zum Schluss davon ausgegangen war, dass um den Desktop mit dem vollständigen Pfad C:\users\Administrator\Desktop aufrufen zu können es nur über die Methode „SpecialFolders“ gehen würde aber andere gewöhnliche Verzeichnisse wiederum über eine andere Methode, habe ich dann hoffnungsvoll nach einer Methode nachgefragt, die alle Pfade verarbeiten kann.
Jetzt stelle ich fest, dass es in dem genannten Skript doch vom Anfang an alles richtig war: objShortcut=objShell.CreateShortcut("%LinkTargetDirectory%\%LinkName%.lnk)

Der Vollständigkeit halber:
Bei Angebe von Umgebungsvariablen in dem Skript direkt, wären folgende beide Zeilen zu benutzen:
Umgebungsvariable = objShell.ExpandEnvironmentStrings("%UserProfile%")  
Set objShortcut = objShell.CreateShortcut(Umgebungsvariable & "\%LinkName%.lnk")  
Bei Angebe von Shell Objects, z. B. damit das Skript das Verzeichnis "Desktop" verarbeiten kann, soll die Methode "SpecialFolders" benutzt werden:
objShortcut=objShell.CreateShortcut(objShell.SpecialFolders("Desktop") & "\%LinkName%.lnk")  

Bei Angabe aller restlichen vollständigen Pfade ist der folgende Aufbau zu benutzen:
objShortcut=objShell.CreateShortcut("%LinkTargetDirectory%\%LinkName%.lnk")  
  

Korrekturen und Ergänzungen sind wie immer gerne willkommen.

Es funktioniert nun alles wie gewollt.


Gruß
evinben
Member: bastla
bastla Mar 09, 2012 at 11:59:54 (UTC)
Goto Top
Hallo evinben!

Nur der Vollständigkeit halber: Natürlich lassen sich in allen Versionen (zusätzliche) Variablen verwenden - oder auch nicht:
Set objShortcut = objShell.CreateShortcut(objShell.ExpandEnvironmentStrings("%UserProfile%") & "\%LinkName%.lnk")
Grüße
bastla

P.S.: Dein letztes Beispiel hat eine ungerade Anzahl von Anführunszeichen ...
Member: Biber
Biber Mar 09, 2012 at 13:30:35 (UTC)
Goto Top
[OT]
Zitat von @bastla:
P.S.: Dein letztes Beispiel hat eine ungerade Anzahl von Anführunszeichen ...
was übrigens auch auf die Anzahl der Buchstaben des Wortes "Anführungszeichen" selbst zutrifft - meistens.

Grüße
Biber
[/OT]
Member: evinben
evinben Mar 09, 2012 at 15:47:02 (UTC)
Goto Top
Hallo bastla!

danke > korrigiert (Anführungszeichen am Ende eingefügt)

Gruß
evinben
Member: evinben
evinben Mar 09, 2012 at 17:29:04 (UTC)
Goto Top
Hallo bastla!

ich habe dein Aufbau - alles auf einer Zeile- neugierig intensiv getestet:
Set objFolder = objShell.Namespace(objShell.ExpandEnvironmentStrings("%Windir%") & "\system32")  

allerdings bekomme ich jeweils die folgende Fehlermeldung

"Das Objekt unterstützt diese Eigenschaft oder Methode nicht.: objShell.ExpandEnvironmentStrings'

Danach folgt die Zeile

Set objFolderItem = objFolder.ParseName("Meine.exe")  

So funktioniert es - wenn der Pfad ohne Umgebungsvariablen eingegeben wird:
Set objFolder = objShell.Namespace("C:\Windows\system32")  

Gruß
evinben
Member: bastla
bastla Mar 09, 2012 at 18:23:11 (UTC)
Goto Top
Hallo evinben!

"Alles auf einer Zeile" spielt dabei allerdings überhaupt keine Rolle - solange Du "WScript.Shell" (für "ExpandEnvironmentStrings()") und "Shell.Application" in einen Topf wirfst, kann das nix werden ...

Grüße
bastla
Member: bastla
bastla Mar 09, 2012 at 18:25:53 (UTC)
Goto Top
[OT2]
@Biber
... allerdings unterscheiden sich uU die Konsequenzen ... face-wink

Schönes Wochenende
bastla
[/OT2]
Member: evinben
evinben Mar 10, 2012 at 04:08:17 (UTC)
Goto Top
Hallo bastla,

guten morgen! Schläffst du noch?

"in einem Topf"...."in einem Topf"... was meint er genau... was vermische ich da? Zumindest einen Einsatz als Hilfe, wo ich etwas nachschlagen kann?
Zum Lernen bin ich ja immer bereit ;)

Gruß
evinben
Member: evinben
evinben Mar 10, 2012 at 05:59:33 (UTC)
Goto Top
ich möchte in dem folgenden Snippsel

Const CSIDL_COMMON_PROGRAMS = &H17
Const CSIDL_PROGRAMS = &H2 
Set objShell = CreateObject("Shell.Application")   
Set objAllUsersProgramsFolder = objShell.NameSpace(CSIDL_COMMON_PROGRAMS) 
strAllUsersProgramsPath = objAllUsersProgramsFolder.Self.Path 
Set objFolder = objShell.Namespace("C:\Windows\System32")   
Set objFolderItem = objFolder.ParseName("notepad.exe")   

einen variablen Pfad verwenden, anstatt einen festen. Dankbar dir habe ich es gelernt für Umgebungsvariablen "ExpandEnvironmentStrings" zu verwenden. Diese Methode ist, so wie ich es aus deinem letzten Schreiben entnehme, allerdings ür WScript.Shell. In meinem Skript handelt es sich, so wie ich es verstanden habe um "Shell.Application". Wie könnte ich es nun lösen?


Danke dir sehr!
evinebn
Member: evinben
evinben Mar 10, 2012 at 06:38:59 (UTC)
Goto Top
Geschaft! Ganz alleine ;)

'Umgebungsvariable setzen  
Set objShell=WScript.CreateObject("Wscript.Shell")  
'Bei Pfade mit Umgebungsvariablen folgende Zeile zu benutzen  
Umgebungsvariable = objShell.ExpandEnvironmentStrings("%AppData%")  


Const CSIDL_COMMON_PROGRAMS = &H17
Const CSIDL_PROGRAMS = &H2 
Set objShell = CreateObject("Shell.Application")   
Set objAllUsersProgramsFolder = objShell.NameSpace(CSIDL_COMMON_PROGRAMS) 
strAllUsersProgramsPath = objAllUsersProgramsFolder.Self.Path 
Set objFolder = objShell.Namespace(Umgebungsvariable) 
Set objFolderItem = objFolder.ParseName("Notepad.lnk")   

Wäre es so richtig mein Meister?

Danke sehr nochmal für den Tipp.

gruß
evinben
Member: bastla
bastla Mar 10, 2012, updated at Oct 18, 2012 at 16:50:17 (UTC)
Goto Top
Hallo evinben!

Wenn's funktioniert, ist es richtig face-wink ...

... allerdings würde ich doch die beiden "Shells" unterschiedlichen Objekten (Variablennamen kannst Du ja - relativ - frei wählen) zuordnen - also zB:
Set objWShell = WScript.CreateObject("WScript.Shell")  
Set objShellApp = CreateObject("Shell.Application")  
- dann kannst Du bei Bedarf (und den hätte es oben bei
Set objFolder = objShell.Namespace(objShell.ExpandEnvironmentStrings("%Windir%") & "\system32")
schon gegeben) beide "nebeneinander" verwenden ...
Ob Du schließlich den "Umweg" über "NameSpace" tatsächlich benötigst, kann ich nicht abschätzen - "AllUsersPrograms" zumindest gibt es auch als einen der "SpecialFolders" (siehe Link oben) ...

Grüße
bastla
Member: evinben
evinben Mar 10, 2012 at 11:38:07 (UTC)
Goto Top
Hallo bastla!

... allerdings würde ich doch die beiden "Shells" unterschiedlichen Objekten (Variablennamen kannst Du ja - relativ - frei wählen)

ahaaa.... :

Set objWShell =
Set objShellApp =


Sauber & beispielhaft. So wird es jedem Anfänger nun klarer, worum es geht, bevor er alles in einem "Topf" zusammenschmeißt ;).


dann kannst Du bei Bedarf (und den hätte es oben bei schon gegeben) beide "nebeneinander" verwenden ...

Gut. Ich werde dennoch die zuletzt gepostete Variante bevorzugen, da der Code etwas kompakter und ich flexibler wäre: ich kann so bei Bedarf in der letzten Zeile (Nr. 13) den vollständigen Pfad eingeben. Bei Auslassung der Variable "Umgebungsvariable" funktioniert es ja weiterhin.
Adnersrum, so wie ich es neugierig zuletzt wollte - alles am besten auf einer Zeile zu schreiben, da es so cooler wäre - würde dann eine zusätzliche IF-Funktion erfordern, um bei Angeben von Pfade ohne Umgebungsvariablen nicht an die Fehlermeldung zu kommen.
Falls ich mich hier teuschen sollte, bitte gerne korrigieren.

So, und jetzt muss ich nur in dem vbs-Skript etwas einbauen, dass die übergebenen Argumente aus einer Batch-Datei empfangen kann. Phhu, das wäre eine neue Herausforderung für mich. Im Batch habe ich es mir nun erfolgriech beigebracht - dankbar euch:

1. Batch-Datei zum Steuern:
 
call "Template.bat" "Schablone zum Kaffee kochen" "latte macchiato" "Espresso" "Cappuccino"  

2. Batch-Datei, die die Argumente empfängt und die Aufgabe tut:
echo Name der Datei: "%1" & echo bietet den folgenden Auswahl an: "%2" || "%3" || "%4"  
 

Wie sollen im vbs-Skript diese Arrgumente ausgelesen werden?

Folgendes habe ich erfahren, was in der .bat-Steuerdatei stehen muss:
wscript "Kaffee kochen.vbs" "Schablone zum Kaffee kochen" "latte macchiato" "Espresso" "Cappuccino"  
Nun kämpfe ich intensiv diese Argumente in dem Skript wiederzugeben. Hier habe ich studiert: Das Beispiel einer BAT-Datei, die als Parameter bzw. Argumente den Inhalt von Umgebungsvariablen an ein Skript übergibt

Wenn ich
set ObjArgs = Wscript.Arguments
msgbox ObjArgs.item(0)
'Set objFolderItem = ObjArgs.item(0)  
eingebe, wird das Argument verarbeitet, dieses muss allerdings in Anführungszeichen gesetzt werden, da es Leerzeichen enthält.
Sobald ich die Anführungszeichen einfüge, tritt ein Fehler auf.


Hallo @Biber
.... was übrigens auch auf die Anzahl der Buchstaben des Wortes "Anführungszeichen" selbst zutrifft - meistens.
das habe ich erst jetzt verstanden bzw. bemerkt ;)

Danke für einen Tipp
evinben
Member: bastla
bastla Mar 10, 2012 at 16:23:29 (UTC)
Goto Top
Hallo evinben!

Wenn Du tatsächlich Anführungszeichen (die mit dem "g" face-wink) benötigst, kannst Du sie ja einfach (bzw eigentlich doppelt oder sogar vierfach face-wink) hinzufügen:
set objArgs = WScript.Arguments
WScript.Echo """" & objArgs(0) & """"  
- alternativ auch mit:
set objArgs = WScript.Arguments
WScript.Echo Chr(34) & objArgs(0) & Chr(34)
Grüße
bastla
Member: evinben
evinben Mar 10, 2012 at 19:04:08 (UTC)
Goto Top
danke bastla!

das mit dem Vierfachen habe ich es mittlerweile erfahren, aber das mit Chr (34) haber erst jetzt gelernt, was das zu bedeuten hat ;)
Übrigens die Anführungszeichen waren ja bei den übergebenen Variablen gaaaar nicht nötig, wie es im Batch ist - vieles neues für mich gewesen.

ALLES FUNKTIONIERT BESTENS UND ICH BIN BEGEISTERT WIE ES IN VBS ABLÄUFT!!! Vorwärts...vorwärts....

bis bald
evinben