stoepsu77
Goto Top

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.
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

Content-ID: 603183

Url: https://administrator.de/forum/goto-geht-einfach-nicht-603183.html

Ausgedruckt am: 22.12.2024 um 17:12 Uhr

TK1987
TK1987 09.09.2020 aktualisiert um 16:27:20 Uhr
Goto Top
Moin,

Zitat von @stoepsu77:
if %vorhanden%==%ABC% goto C
if %vorhanden%==%XYZ% goto Server
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
Dr.Bit
Dr.Bit 09.09.2020 um 16:15:27 Uhr
Goto Top
Muß es in Zeile 9 nicht else statt if heißen?

🖖
stoepsu77
stoepsu77 09.09.2020 um 16:45:45 Uhr
Goto Top
Hallo TK1987

Danke!
Einfach mal kurz was für mich geschrieben. Toll!

Ich bin leider nicht so fit in Powershell.

Das Ding funktioniert super nur noch ein kleines Problem.
Wenn 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.

Aber eben ich und Powershell sind noch keine Freunde.

Kannst du mir da noch mal helfen?

Danke
BeMe
stoepsu77
stoepsu77 09.09.2020 um 16:46:22 Uhr
Goto Top
@Dr.Bit

else hilft nicht

trotzdem Danke

BeMe
TK1987
TK1987 09.09.2020 um 16:54:20 Uhr
Goto Top
Zitat von @stoepsu77:
Wenn es den Schlüssel noch gar nicht gibt, müsste er mit den PfadB angaben angelegt werden
Kein Problem
plus noch ein weiter anderer Schlüssel angelegt werden.
Als der wäre?
stoepsu77
stoepsu77 09.09.2020 um 17:06:59 Uhr
Goto Top
Bei mir hätte der so ausgesehen
REG ADD "HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Explorer" /v "LockedStartLayout" /t REG_DWORD /d "1" /f
TK1987
Lösung TK1987 09.09.2020 aktualisiert um 18:00:01 Uhr
Goto Top
$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)
stoepsu77
stoepsu77 10.09.2020 um 08:50:12 Uhr
Goto Top
Hallo TK1987

Du bist mein Held, das weisst Du?

Vielen vielen dank.

Leider funktioniert Dein Script nicht, wenn der Schlüssel
LockedStartLayout und StartLayoutFile nicht in der Registry sind.
Die werden leider nicht eingetragen.

Leider verstehe ich Dein Script nur wage, hab also keinen Plan woran es liegen könnte.

Danke
BeMe
TK1987
TK1987 10.09.2020 um 09:09:40 Uhr
Goto Top
Bei mir funktioniert das wunderbar.
Welche Fehlermeldung wird den bei dir ausgegeben?
stoepsu77
stoepsu77 10.09.2020 um 09:27:47 Uhr
Goto Top
keine. er macht einfach keine Einträge.
TK1987
TK1987 10.09.2020 aktualisiert um 09:55:58 Uhr
Goto Top
Zitat von @stoepsu77:
keine.
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
gp 'Registry::HKCU\Software\Policies\Microsoft\Windows\Explorer'  
stoepsu77
stoepsu77 10.09.2020 um 10:12:53 Uhr
Goto Top
Ich hab versucht das Ganze mal etwas zu Dokumentieren.


Wenn die beiden Einträge bereits in der Registry sind, funktioniert der Wechsel perfekt.
Nur ohne die Einträge passiert irgendwie nix. (Bild)

registry
145916
145916 10.09.2020 aktualisiert um 10:25:01 Uhr
Goto Top
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.

Hier fehlen die doppelten Prozentzeichen für die Laufvariable, so funktioniert das nur auf der Konsole nicht aber innerhalb einer Batchdatei face-wink, 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"  
TK1987
Lösung TK1987 10.09.2020 um 10:40:56 Uhr
Goto Top
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
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) {
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
Powershell -EP ByPass -File "C:\Users\g.muster\Desktop\Profile_a.Ps1"  
stoepsu77
stoepsu77 10.09.2020 um 10:42:57 Uhr
Goto Top
Danke eaglerfinder

ich bin im Moment noch auf Konsolen Ebene.
Deine Verbesserung hab ich ausprobiert. bringt leider auch nichts.

Danke
stoepsu77
stoepsu77 10.09.2020 um 10:51:32 Uhr
Goto Top
Sorry für die Verwirrung.

Jetzt klappt alles genau so wie es sein soll!

Vielen vielen Dank!
Du bist echt super.
145916
145916 10.09.2020 aktualisiert um 11:19:04 Uhr
Goto Top
Zitat von @stoepsu77:
Deine Verbesserung hab ich ausprobiert. bringt leider auch nichts.
Klappt hier einwandfrei, natürlich inkl. Verbesserungen wie Anführungszeichen in den IF-Vergleichen ...