Goto geht einfach nicht
Hallo zusammen
Ich habe eine Batch datei gebaut, die einfach den Goto Befehl nicht macht.
Ich sehe aber den Fehler einfach nicht.
So hoffe ich doch, dass mir hier jemand den zündenden Hinweis geben kann.
Wenn ich z.B.
if %vorhanden%==%ABC% mit echo stimmt prüfe, gibt er mir stimmt aus, wennin der registry der ABC Wert steht.
Ebenso bei XYZ.
Also ist der eine oder andere IF wahr. Aber warum springt er dann nicht mit goto an den richtigen Ort?
Es wird einfach immer alles verarbeitet.
Er soll aber wechseln.
Also wenn ABC Pfad in der registry steht soll er wechseln auf XYZ Pfad uns.
hat jemand einen Rat für mich?
Danke
BeMe
Ich habe eine Batch datei gebaut, die einfach den Goto Befehl nicht macht.
Ich sehe aber den Fehler einfach nicht.
So hoffe ich doch, dass mir hier jemand den zündenden Hinweis geben kann.
set vorhanden=
set ABC=\\xxx\SYSVOL\xxx\Scripts\Apps\Start\StartLayout.xml
set XYZ=C:\Tools\Einrichten\Users\AllUsers\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml
for /f "tokens=3" %i in ('reg query "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer" /v "StartLayoutFile" ') do set "vorhanden=%i"
echo %vorhanden%
if %vorhanden%==%ABC% goto C
if %vorhanden%==%XYZ% goto Server
:C
REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer" /v "StartLayoutFile" /t REG_EXPAND_SZ /d "C:\Tools\Einrichten\Users\AllUsers\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" /f
goto End
:Server
REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer" /v "StartLayoutFile" /t REG_EXPAND_SZ /d "\\xxx\SYSVOL\xxx\Scripts\Apps\Start\StartLayout.xml" /f
goto End
:End
Wenn ich z.B.
if %vorhanden%==%ABC% mit echo stimmt prüfe, gibt er mir stimmt aus, wennin der registry der ABC Wert steht.
Ebenso bei XYZ.
Also ist der eine oder andere IF wahr. Aber warum springt er dann nicht mit goto an den richtigen Ort?
Es wird einfach immer alles verarbeitet.
Er soll aber wechseln.
Also wenn ABC Pfad in der registry steht soll er wechseln auf XYZ Pfad uns.
hat jemand einen Rat für mich?
Danke
BeMe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 603183
Url: https://administrator.de/contentid/603183
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
17 Kommentare
Neuester Kommentar
Moin,
ich würde die Vergleich mit If immer in Anführungszeichen setzen, sowas macht oft Probleme.
Ansonsten...
Gruß Thomas
ich würde die Vergleich mit If immer in Anführungszeichen setzen, sowas macht oft Probleme.
Ansonsten...
hat jemand einen Rat für mich?
... ist wie immer der beste Rat: Lass das Batch-rumgemurkse sein und arbeite lieber mit Powershell$PfadA = "C:\Tools\Einrichten\Users\AllUsers\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml"
$PfadB = "\\xxx\SYSVOL\xxx\Scripts\Apps\Start\StartLayout.xml"
$Schlüssel = 'Registry::HKCU\Software\Policies\Microsoft\Windows\Explorer'
switch ((gp $Schlüssel).StartLayoutFile) {
$PfadA {
write-host -n "Schlüssel wird umgestellt auf '$PfadB'... "
try {
Set-Itemproperty -Path $Schlüssel -Name 'StartLayoutFile' -Value $PfadB -EA stop
write-host -f green "erfolgreich."
} catch {write-host -f red $_.Exception.Message}
}
$PfadB {
write-host -n "Schlüssel wird umgestellt auf '$PfadA'... "
try {
Set-Itemproperty -Path $Schlüssel -Name 'StartLayoutFile' -Value $PfadA -EA stop
write-host -f green "erfolgreich."
} catch {write-host -f red $_.Exception.Message}
}
}
write-host -n "`nBeliebige Taste zum Beenden... "
[void][console]::ReadKey($true)
Gruß Thomas
Zitat von @stoepsu77:
Wenn es den Schlüssel noch gar nicht gibt, müsste er mit den PfadB angaben angelegt werden
Kein ProblemWenn es den Schlüssel noch gar nicht gibt, müsste er mit den PfadB angaben angelegt werden
plus noch ein weiter anderer Schlüssel angelegt werden.
Als der wäre?$PfadA = "C:\Tools\Einrichten\Users\AllUsers\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml"
$PfadB = "\\xxx\SYSVOL\xxx\Scripts\Apps\Start\StartLayout.xml"
$Schlüssel = 'Registry::HKCU\Software\Policies\Microsoft\Windows\Explorer'
if (Test-Path $Schlüssel) {
switch ((gp $Schlüssel).StartLayoutFile) {
$PfadA {
write-host -n "Schlüssel wird umgestellt auf '$PfadB'... "
try {
Set-Itemproperty -Path $Schlüssel -Name 'StartLayoutFile' -Value $PfadB -EA stop
write-host -f green "erfolgreich."
} catch {write-host -f red $_.Exception.Message}
}
$PfadB {
write-host -n "Schlüssel wird umgestellt auf '$PfadA'... "
try {
Set-Itemproperty -Path $Schlüssel -Name 'StartLayoutFile' -Value $PfadA -EA stop
write-host -f green "erfolgreich."
} catch {write-host -f red $_.Exception.Message}
}
}
}
else {
write-host -n "Schlüssel '$Schlüssel' wird erstellt... "
try {
md -force $Schlüssel -EA Stop >$NULL
write-host -f green "erfolgreich."
write-host -n "Setze 'StartLayoutFile' auf '$PfadB'... "
Set-Itemproperty -Path $Schlüssel -Name 'StartLayoutFile' -Value $PfadB -EA stop
write-host -f green "erfolgreich."
write-host -n "Setze 'LockedStartLayout' auf 1... "
Set-Itemproperty -Path $Schlüssel -Name 'LockedStartLayout' -Value 1 -EA stop
write-host -f green "erfolgreich."
} catch {write-host -f red $_.Exception.Message}
}
write-host -n "`nBeliebige Taste zum Beenden... "
[void][console]::ReadKey($true)
Entweder steht in grün erfolgreich dahinter, dann hat er die Werte des Schlüssels auch gesetzt, oder es wird in rot dahinter eine Meldung ausgegeben.
Wenn überall in grün erfolgreich dahinter steht, dann öffne mal Powershell und poste hier die Ausgabe von
Wenn überall in grün erfolgreich dahinter steht, dann öffne mal Powershell und poste hier die Ausgabe von
gp 'Registry::HKCU\Software\Policies\Microsoft\Windows\Explorer'
Zitat von @stoepsu77:
Hallo zusammen
Ich habe eine Batch datei gebaut, die einfach den Goto Befehl nicht macht.
Ich sehe aber den Fehler einfach nicht.
Hallo zusammen
Ich habe eine Batch datei gebaut, die einfach den Goto Befehl nicht macht.
Ich sehe aber den Fehler einfach nicht.
Hier fehlen die doppelten Prozentzeichen für die Laufvariable, so funktioniert das nur auf der Konsole nicht aber innerhalb einer Batchdatei , außerdem berücksichtigt es keine Leerzeichen im Value
for /f "tokens=3" %i in ('reg query "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer" /v "StartLayoutFile" ') do set "vorhanden=%i"
for /f "tokens=2,*" %%a in ('reg query "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer" /v "StartLayoutFile" ') do set "vorhanden=%%b"
Achsooo xD. Ich glaube wir haben da aneinander vorbei gredet.
Zur Info: Als Registry-Schlüssel bezeichnet man z.B. HKCU\Software\Policies\Microsoft\Windows\Explorer.
StartLayoutFile hingegen ist nur der Wert eines Schlüssels (nicht der Schlüssel selbst).
Was ich also gemacht habe, war mit If zu überprüfen, ob der Schlüssel existiert. Was du (nehme ich mal an wolltest), war hingegegen zu überprüfen, ob der Wert des Schlüssels existiert.
Daher
Ändere das If-Statement (Zeile 6) bitte wie folgt ab:
Dann dürfte alles wie gewünscht funktionieren.
BTW: Powershell-Skripte ausführen geht am besten so:
Leg das Skript in irgend einen Ort, wo es nicht stört.
Dann drücke Rechtsklick > kopieren und gehe an den Ort, von wo aus du es ausführen möchtest. Hier drückst du Rechtsklick > Verknüpfung einfügen.
Auf diese Verknüpfung Rechtsklick > Eigenschaften und bei Ziel vor den Pfad zum Skript noch Powershell -EP ByPass -File eintragen.
In deinem jetziegn Fall stände bei Ziel dann
Zur Info: Als Registry-Schlüssel bezeichnet man z.B. HKCU\Software\Policies\Microsoft\Windows\Explorer.
StartLayoutFile hingegen ist nur der Wert eines Schlüssels (nicht der Schlüssel selbst).
Was ich also gemacht habe, war mit If zu überprüfen, ob der Schlüssel existiert. Was du (nehme ich mal an wolltest), war hingegegen zu überprüfen, ob der Wert des Schlüssels existiert.
Daher
Vermutlich wird das Skript abgebrochen
Nein, dann käme eine Fehlermeldung. Es wird ausgeführt - und das volkommen korrekt. Der Schlüssel selbst existiert, nur der Wert halt nicht.Ändere das If-Statement (Zeile 6) bitte wie folgt ab:
if ((gp $Schlüssel -EA si).StartLayoutFile) {
BTW: Powershell-Skripte ausführen geht am besten so:
Leg das Skript in irgend einen Ort, wo es nicht stört.
Dann drücke Rechtsklick > kopieren und gehe an den Ort, von wo aus du es ausführen möchtest. Hier drückst du Rechtsklick > Verknüpfung einfügen.
Auf diese Verknüpfung Rechtsklick > Eigenschaften und bei Ziel vor den Pfad zum Skript noch Powershell -EP ByPass -File eintragen.
In deinem jetziegn Fall stände bei Ziel dann
Powershell -EP ByPass -File "C:\Users\g.muster\Desktop\Profile_a.Ps1"
Klappt hier einwandfrei, natürlich inkl. Verbesserungen wie Anführungszeichen in den IF-Vergleichen ...