batch verpixel?
Hey,
Wie kann man in Batch Namen oder schrift verpixeln?
Also zB: Haus zu ****
also so Verpixeln
Danke!
Kannst du bitte noch einmal versuchen, zu beschreiben, was du erreichen möchtest?
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
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)
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)
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.
Naja . Batch und Passwortabfragen: sind jetzt nicht unbedingt etwas was , was wirklich Sinn macht. https://www.gutefrage.net/frage/batch-variable-mit-sha256-key-vergleichen#answer-392614454
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.
...😄 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.