marcimarc85
Goto Top

Batch set variable echo Ausgabe bleibt leer

Hallo .

ich möchte gern die eingabe einer set /p Abfrage im Anschluss, zur bestätigung per echo ausgeben.
Beispiel:

set /p user="Fuer welche user möchten sie das passwort zurücksetzten (bsp. User1|User2|User9): "   
Hier tippe ich nun z.B. User1|User5 ein
set /p pwd="Wie soll das neue Passwort für diese User lauten?: "  
Hier tippe ich nun z.B. a ein

Dann kommt :


echo Das Passwort für User %user% wird auf %pwd% zurückgesetzt

Als Ausgabe kommt nun allerdings

Das Passwort für wird auf zurückgesetzt

Ich habe diese Abfrage aus einem anderen, bereits bestehenden Script raucskopiert. Da klappt das problemlos. Ich kann mir aber nicht erklären, warum das bei meinem neuen Scipt nicht funktioniert und nur ein leerer Platzhalter angezeigt wird.

Content-ID: 1524223538

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

Ausgedruckt am: 25.11.2024 um 06:11 Uhr

em-pie
em-pie 18.11.2021 um 11:55:14 Uhr
Goto Top
Moin,

und du gibst den Benutzer tatsächlich mit einem Pipe ein?
Das dürfte dein Problem sein...

Gruß
em-pie
NordicMike
NordicMike 18.11.2021 um 11:59:46 Uhr
Goto Top
Dann müsste jedoch die %pwd% Variable funktionieren. Ich vermute er hat das letzte Echo mit %user% und %pwd% noch in den Anführungszeichen drinnen.
149569
149569 18.11.2021 aktualisiert um 12:15:05 Uhr
Goto Top
Wo stehen die Befehle im Kontext deines Skripts genau?
Stehen sie innerhalb von Klammern ? Wenn ja dann musst du delayed Expansion oder call set benutzen. Und die Variablen in Ausrufezeichen setzen denn sonst existieren die Variablen innerhalb des Klammer-Konstrukts nicht
https://ss64.com/nt/delayedexpansion.html

Bsp. wenn das ganze oben innerhalb von Klammern (z.B. in nem For-Loop oder nem geklammerten IF) steht
@echo off &setlocal enabledelayedexpansion
chcp 1252 >nul
(
    set /p "user=Fuer welche user möchten sie das passwort zurücksetzten (bsp. User1|User2|User9): "  
    set /p "pwd=Wie soll das neue Passwort für diese User lauten?: "  
    echo Das Passwort für User !user! wird auf !pwd! zurückgesetzt
)
em-pie
em-pie 18.11.2021 aktualisiert um 12:19:47 Uhr
Goto Top
Zitat von @NordicMike:

Dann müsste jedoch die %pwd% Variable funktionieren. Ich vermute er hat das letzte Echo mit %user% und %pwd% noch in den Anführungszeichen drinnen.

also wenn ich das "stumpf" in eine batch.cmd kopiere:
set /p user="Fuer welche user möchten sie das passwort zurücksetzten (bsp. User1|User2|User9): "   
set /p pwd="Wie soll das neue Passwort für diese User lauten?: "  

echo Das Passwort für User %user% wird auf %pwd% zurückgesetzt
und ausführe, dann sieht das bei mir so aus:
Fuer welche user möchten sie das passwort zurücksetzten (bsp. User1|User2|User9): User1|User5
Wie soll das neue Passwort für diese User lauten?: a
Der Befehl "User5" ist entweder falsch geschrieben oder  
konnte nicht gefunden werden.

C:\tmp>


Edit: Typo
MarciMarc85
MarciMarc85 18.11.2021 um 12:19:20 Uhr
Goto Top
Das mit der Pipe zum Aufzählen der Usernamen muss so, ist auch in dem Ursprungsscript so, da diese Variable später in ein SQL Kommando gepakt wird und die Syntax dort so ist. Passt auch bisher immer so.

Das neue Script sieht so aus:

@echo off
setlocal ENABLEDELAYEDEXPANSION 

::::: IP-Adesse bestimmen :::::
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b  
set _ip_address=%ip:~1%


::::: Hostname bestimmen :::::
for /f "usebackq" %%i IN (`hostname`) DO SET _dns_name=%%i  


::::: Scripnamen bestimmen :::::
set _scriptname=%~nx0


::::: Action Parameter bestimmen :::::
set /p _recovery_file="Which full MySQL dump (.sql) OR MySQL dump zip archive (.sql.zip) you want to recover  (e.g. d:\temp\lm\full_20130214-1011.sql): "  

set /p _sql_root_pw="Enter MYSQL root password: "  

set /p _answer="Should i do a backup of the current database? (y/n) "  
if /i [%_answer%]==[y] (
	set database_backup=true
	set _backup=database backup=yes
	) else (
	set _backup=database backup=no
	)

set /p _answer="Should i cleanup downloads, workspaces and session data? (y/n)""  
if /i [%_answer%]==[y] (
	set _cleanup_session=true
	set _clear_statistics=clear statistics=yes
	) else (
	set _clear_statistics=clear statistics=no
	)


set /p _answer="Should i change the passwords and emails of some users? (y/n) "  
if /i [%_answer%]==[y] (
	set /p _sql_user_filter="Enter SQL REGEXP filter for username which should be _not_ changed (e.g. root|rss):"  
	set /p _user_passwords="Enter new password for users:"  
	set _useraccdata=reset e-mail=yes, reset user password=yes, users not to reset="%_sql_user_filter%", new password="%_user_passwords%"  
	) else (
	set _useraccdata=reset e-mail=no, reset user password=no
	)

echo %_ip_address%, %_dns_name%, %_scriptname%, %_backup%, recovery file=%_recovery_file%, %_clear_statistics%, %_useraccdata%

pause

Alle Variablen werden im letzten echo korrekt angezeigt. nur eben _sql_user_filter und _user_passwords eben nicht. Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
149569
149569 18.11.2021 aktualisiert um 12:24:28 Uhr
Goto Top
149569
149569 18.11.2021 aktualisiert um 12:25:25 Uhr
Goto Top
Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
Lies meinen Kommentar und mein Codebeispiel oben noch mal ganz genau! Du musst die Variablen dann in Ausrufezeichen setzen wenn du delayed expansion innerhalb des Klammmerkonstrukts nutzen willst!
erikro
erikro 18.11.2021 um 12:34:56 Uhr
Goto Top
Moin,

Zitat von @149569:

Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
Lies meinen Kommentar und mein Codebeispiel oben noch mal ganz genau! Du musst die Variablen dann in Ausrufezeichen setzen wenn du delayed expansion innerhalb des Klammmerkonstrukts nutzen willst!

Oder man nimmt gleich die Skriptsprache, die für sowas heute vorgesehen ist. Dann muss man nicht mehr an den alten Krücken gehen, sondern schreibt einfach eine Zeile:
Set-ADAccountPassword -Identity (Read-Host -prompt "Username?") -Reset -NewPassword (Convertto-SecureString -AsPlainText (read-host -AsSecureString -prompt "Password") -force)  

my 2 cents face-wink

Erik
149569
149569 18.11.2021 aktualisiert um 12:42:59 Uhr
Goto Top
Zitat von @erikro:
Oder man nimmt gleich die Skriptsprache, die für sowas heute vorgesehen ist.
Full ackn.

Wenn es sich dabei tstsächlich um AD Accounts handelt. Aber auch für evt. reine SQL-User gibt's da ja was von Ratiopharm...
https://docs.microsoft.com/en-us/powershell/module/sqlserver/set-sqlcred ...

Aber manch einer der Batchies lernt es halt nicht mehr ...
erikro
erikro 18.11.2021 um 12:48:06 Uhr
Goto Top
Zitat von @149569:

Zitat von @erikro:
Oder man nimmt gleich die Skriptsprache, die für sowas heute vorgesehen ist.
Full ackn.

Wenn es sich dabei tstsächlich um AD Accounts handelt.

Klar, aber auch für andere Accounts kann man das meist in einer Zeile erledigen.

Aber auch für evt. reine SQL-User gibt's da ja was von Ratiopharm...

Eben.

Aber manch einer der Batchies lernt es halt nicht mehr ...

*g*
MarciMarc85
MarciMarc85 18.11.2021 um 12:49:26 Uhr
Goto Top
Zitat von @149569:

Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
Lies meinen Kommentar und mein Codebeispiel oben noch mal ganz genau! Du musst die Variablen dann in Ausrufezeichen setzen wenn du delayed expansion innerhalb des Klammmerkonstrukts nutzen willst!

Du meinst also so:

set /p "_user_passwords=Enter new password for users:"  
anstatt so:
set /p _user_passwords="Enter new password for users:"  

Das Ergebins ist, dass weiterhin nichts angezeigt wird
MarciMarc85
MarciMarc85 18.11.2021 um 12:51:00 Uhr
Goto Top
Zitat von @erikro:

Moin,

Zitat von @149569:

Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
Lies meinen Kommentar und mein Codebeispiel oben noch mal ganz genau! Du musst die Variablen dann in Ausrufezeichen setzen wenn du delayed expansion innerhalb des Klammmerkonstrukts nutzen willst!

Oder man nimmt gleich die Skriptsprache, die für sowas heute vorgesehen ist. Dann muss man nicht mehr an den alten Krücken gehen, sondern schreibt einfach eine Zeile:
> Set-ADAccountPassword -Identity (Read-Host -prompt "Username?") -Reset -NewPassword (Convertto-SecureString -AsPlainText (read-host -AsSecureString -prompt "Password") -force)  
> 

my 2 cents face-wink

Erik


Zitat von @erikro:

Moin,

Zitat von @149569:

Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
Lies meinen Kommentar und mein Codebeispiel oben noch mal ganz genau! Du musst die Variablen dann in Ausrufezeichen setzen wenn du delayed expansion innerhalb des Klammmerkonstrukts nutzen willst!

Oder man nimmt gleich die Skriptsprache, die für sowas heute vorgesehen ist. Dann muss man nicht mehr an den alten Krücken gehen, sondern schreibt einfach eine Zeile:
> Set-ADAccountPassword -Identity (Read-Host -prompt "Username?") -Reset -NewPassword (Convertto-SecureString -AsPlainText (read-host -AsSecureString -prompt "Password") -force)  
> 

my 2 cents face-wink

Erik

es muss aber zwingend batch sein und nicht Powershell, da das ja nur ein kleiner Teil, eines großen Scripts ist, was so, wie es jetzt ist, jahrelang fehlerfrei funktioniert. warum sollte ich dass jetzt komplett auf Powershell umstellen?
149569
149569 18.11.2021 aktualisiert um 13:03:15 Uhr
Goto Top
Zitat von @MarciMarc85:

Zitat von @149569:

Hab auch mal das enabledelayedexpansion und die Anführungszeichen hinzugefügt. aber das bringt auch nix
Lies meinen Kommentar und mein Codebeispiel oben noch mal ganz genau! Du musst die Variablen dann in Ausrufezeichen setzen wenn du delayed expansion innerhalb des Klammmerkonstrukts nutzen willst!

Du meinst also so:

set /p "_user_passwords=Enter new password for users:"  
anstatt so:
set /p _user_passwords="Enter new password for users:"  

Das Ergebins ist, dass weiterhin nichts angezeigt wird

Nein meine ich nicht! Lies doch bitte mal den Code genau .... bei der Ausgabe und Nutzung der Variablen musst du Ausrufezeichen (!) statt Prozentzeichen(%) verwenden!

echo !_user_passwords!

Steht doch genau so auch im Link zu delayed expansion ... aber Lesen wird ja heutzutage überbewertet ... 🐟.
MarciMarc85
MarciMarc85 18.11.2021 um 13:49:36 Uhr
Goto Top
Zitat von @149569:

Steht doch genau so auch im Link zu delayed expansion ... aber Lesen wird ja heutzutage überbewertet ... 🐟.

Ich hab mir das sehr wohl angeschaut. mit ! beendet sich das Sript aber sofort, wenn ich die Abfrage nach Änderung von Username und Passwort mit y bestätige
149569
Lösung 149569 18.11.2021 aktualisiert um 14:31:49 Uhr
Goto Top
Zitat von @MarciMarc85:
Ich hab mir das sehr wohl angeschaut.
No comment.
mit ! beendet sich das Sript aber sofort, wenn ich die Abfrage nach Änderung von Username und Passwort mit y bestätige
Das hat damit nichts zu tun da stimmen eben sonst noch so einige Dinge nicht ...

So läuft das hier problemlos durch
@echo off

::::: IP-Adesse bestimmen :::::
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set "ip=%%b"  
set "_ip_address=%ip:~1%"  


::::: Hostname bestimmen :::::
for /f "usebackq" %%i IN (`hostname`) DO SET "_dns_name=%%i"  


::::: Scripnamen bestimmen :::::
set "_scriptname=%~nx0"  


::::: Action Parameter bestimmen :::::
set /p "_recovery_file=Which full MySQL dump (.sql) OR MySQL dump zip archive (.sql.zip) you want to recover  (e.g. d:\temp\lm\full_20130214-1011.sql): "  

set /p "_sql_root_pw=Enter MYSQL root password: "  

set /p "_answer=Should i do a backup of the current database? (y/n) "  
if /i [%_answer%]==[y] (
	set "database_backup=true"  
	set "_backup=database backup=yes"  
) else (
	set "_backup=database backup=no"  
)

set "/p _answer=Should i cleanup downloads, workspaces and session data? (y/n)"  
if /i [%_answer%]==[y] (
	set "_cleanup_session=true"  
	set "_clear_statistics=clear statistics=yes"  
) else (
	set "_clear_statistics=clear statistics=no"  
)

set /p _answer="Should i change the passwords and emails of some users? (y/n) "  
if /i [%_answer%]==[y] (
	set /p "_sql_user_filter=Enter SQL REGEXP filter for username which should be _not_ changed (e.g. root|rss):"  
	set /p "_user_passwords=Enter new password for users:"  
        setlocal ENABLEDELAYEDEXPANSION 
	set "_useraccdata=reset e-mail=yes, reset user password=yes, users not to reset="!_sql_user_filter!", new password="!_user_passwords!""  
) else (
	set "_useraccdata=reset e-mail=no, reset user password=no"  
)

echo %_ip_address%, %_dns_name%, %_scriptname%, %_backup%, recovery file=%_recovery_file%, %_clear_statistics%, %_useraccdata%

pause
erikro
erikro 18.11.2021 um 15:25:25 Uhr
Goto Top
Zitat von @MarciMarc85:
es muss aber zwingend batch sein und nicht Powershell, da das ja nur ein kleiner Teil, eines großen Scripts ist, was so, wie es jetzt ist, jahrelang fehlerfrei funktioniert. warum sollte ich dass jetzt komplett auf Powershell umstellen?

Mein Windows98 läuft auch schon seit zwanzig Jahren fehlerfrei. Warum sollte ich das jetzt komplett umstellen? face-wink

Deine Ausgangsfrage beantwortet diese Frage: Weil die PS mehr Möglichkeiten bietet, dabei sogar einfacher ist und vor allem Umstellungen und Erweiterungen sehr viel eleganter zu erledigen sind als mit der uralten Batch-Krücke.
MarciMarc85
MarciMarc85 19.11.2021 um 07:34:35 Uhr
Goto Top
Zitat von @149569:
Vielen Dank für die Lösung! Jetzt sehe ich auch, wo bei mir der Fehler war. Im Prinzip hätte es gereicht die Ausgabe der Variable mit ! zusätzlich mit " zu umschließen.
Allerdings wird nun in der echo_Ausgabe die Variable mit den umschließenden " angezeigt. Schöner wäre es gewesen ohne, aber das ist offensichtlich in diesem Fall nicht möglich.
149569
149569 19.11.2021 aktualisiert um 11:06:52 Uhr
Goto Top
Zitat von @MarciMarc85:
Allerdings wird nun in der echo_Ausgabe die Variable mit den umschließenden " angezeigt. Schöner wäre es gewesen ohne, aber das ist offensichtlich in diesem Fall nicht möglich.
Das kannst du leicht ändern indem du sie entfernst ... Dachte nur die wären bei deiner Ausgabe pflicht gewesen, nötig für die Funktionsweise sind sie hier nicht.