batch verpixel?

Tilo2300  04.12.2022, 23:17

Kannst du bitte noch einmal versuchen, zu beschreiben, was du erreichen möchtest?

gruseligeoma 
Fragesteller
 05.12.2022, 14:53

Hey,

Ich meine man kann in batch ja mit %username% den nutzernamen ausgeben. Jtz will ich das der nutzername nur in der richtigen Anzahl an "*" ausgegeben wird!

Danke!

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

eigentlich nicht direkt.

Du kannst bestenfalls in einer Variable einzelne Worte /Zeichen durch anderer Zeichen(ketten) ersetzen.

demo.cmd

@echo off
chcp 65001 >nul

set "MeinRawString=Ach, wie gut, dass niemand weiß, dass ich Rumpelstilzchen heiß."
 rem replace-Funktion in Batch:
echo %MeinRawString:Rumpelstilzchen=****%
pause

Unangenehm könnte die Sache werden, wenn es der auszutauschende String * oder = enthält

Leider hast Du nicht erwähnt in welchem Zusammenhang Du das benötigst. Wenn ich in meine magische Glaskugel schaue , dürfte Diese mir wohl sagen, das es um einen verdeckten Input geht. Ich klaue also mal bei mir selbst:

hiddenInput.cmd

@echo off
<nul set /p "=Gib den Nutzernamen ein :"
call :getStringHidden _User
echo Du hast "%_User%" eingegeben
echo:

<nul set /p "=Gib dein Passwort ein :"
call :getStringHidden _Passwort
echo Du hast "%_Passwort%" eingegeben
echo:
pause
exit /b

::: Subroutines ::::

:getStringHidden  %1=Variablename
set "_Accumulator="
:loop
for /f "tokens=2 delims=] skip=1" %%. in ('replace.exe ? . /u /w ^|find /n /v ""') do (set "Key=%%~.")
if "%Key%"=="" (
  set "%~1=%_Accumulator%"
  echo:
  exit /b
)
<nul set /p "=*"
set "_Accumulator=%_Accumulator%%Key%"
goto :loop
exit /b

Batch wird ziemlich schnell unangenehm, wenn die Aufgaben über das Starten von ein paar Programmen und einfache Textausgaben hinausgehen und man muss tief in die Trickkiste greifen.

Stecke nicht mehr allzuviel Energie in Batch. die Zukunft liegt in Powershell.

In Powershell ist die ganze Sache total simpel:

hiddenInput.ps1

 #sicherer input
$securedValue = Read-Host "Gib dein Passwort ein " -AsSecureString
 #sicheren Input in einen String umwandeln
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securedValue)
$plainStr = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
'Du hast "{0}" eingegeben' -f $plainStr 
pause

update:

Ich meine man kann in batch ja mit %username% den nutzernamen ausgeben. Jtz will ich das der nutzername nur in der richtigen Anzahl an "*" ausgegeben wird!

Damit kommt man in den Bereich wo Batch unangenehm wird. Batch hat keine Funktion um die Länge von Strings zu ermitteln und man muss Zaubern:

@echo off
chcp 65001 >nul
for /f "skip=1 delims=:" %%a in ('"(echo:%UserName%&echo:)|findstr /o $"') do  set /a "len=%%a-3"
for /l %%a in (1,1,%len%) do call set "replacement=%%replacement%%*"
echo %UserName%
echo %replacement%
pause

in Powershell:

'*'*($env:username.length)
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Du könntest die Daten in ein externes File legen und dieses einlesen.

Den Zugriff auf die Datei solltest du dann nur dem Batch gestatten, damit das wenigstens annähernd Sinn ergibt.

Einen verdeckten Input machst du mit echo off und set /p.
(ungetestet)

Erzesel  05.12.2022, 11:19
(ungetestet)

...😄 jep ,geht nämlich nicht. set /p schreibt intern die aus dem "Tastenpuffer" gelesenen Zeichen direkt in den Output. Ein blindes Tippen von Strings (ohne jegliches Feedback) würde nicht viel Sinn machen.

@echo off
  rem die Umleitung des Outputs wirkt zwar auf die  Ausgabe des Prompttextes, jedoch nicht auf die Eingabe
set /p "str=Hallo ich  bin der Fragetext:" >nul
echo Du hast "%str%" eingegeben
pause
1
Suboptimierer  05.12.2022, 11:27
@Erzesel

Tatsache. Ich würde nicht generell das als unsinnig deklarieren. Bei einer Passworteingabe wäre das verständlich, dass man die Eingabe nicht direkt zeigen wollen würde.

0
Suboptimierer  05.12.2022, 11:43
@Erzesel

Vielleicht gibt es Programme, die sich mit Username/Passwort als Parameter öffnen lassen, also wenn ein Fall vorläge, bei dem das Passwort durchgereicht werden soll.

1