Batch-Input so abgreifen, als wäre die Tastatur auf en-us gestellt
Moin Kollegen!
Kennt jemand den vermutlich einfachen Kunstgriff, um die Variable Input, die man in Batch (oder Powershell) vom Windows-Nutzer abfragt über
vor der Weiterverarbeitung so umzuformen, als wäre sie mit englischem (en-us) Tastaturlayout eingegeben worden?
Sprich: Nutzer gibt zum Beispiel ein az?# aber es soll weiterverarbeitet werden als ay_\
PS: muss unbedingt auch auf 64-Bit-Systemen funktionieren!
Kennt jemand den vermutlich einfachen Kunstgriff, um die Variable Input, die man in Batch (oder Powershell) vom Windows-Nutzer abfragt über
set /p Input=umzuformende Eingabe?
Sprich: Nutzer gibt zum Beispiel ein az?# aber es soll weiterverarbeitet werden als ay_\
PS: muss unbedingt auch auf 64-Bit-Systemen funktionieren!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 233504
Url: https://administrator.de/contentid/233504
Ausgedruckt am: 25.11.2024 um 11:11 Uhr
22 Kommentare
Neuester Kommentar
Moin DWW,
Die choice von winfuture erfasst die Zeichen so. Die ist aber glaub ich 16 bit, ob sich das mit 64 bit verträgt?
eingabe ohne die x-zeilen sollte es so tun.
On the fly würde das ein Script mit xcopy-abfrage erledigen.
Ich muss aber erstmal ins Bett.
Gruß Phil
Die choice von winfuture erfasst die Zeichen so. Die ist aber glaub ich 16 bit, ob sich das mit 64 bit verträgt?
eingabe ohne die x-zeilen sollte es so tun.
On the fly würde das ein Script mit xcopy-abfrage erledigen.
Ich muss aber erstmal ins Bett.
Gruß Phil
Hallo DWW,
falls es für Dich eine Option ist, das Tastaturlayout aus dem Batchscript heraus temporär auf en-us umzuschalten, um die Benutzereingabe zu erfassen, schau Dir das mal an.
Gruß
Friemler
falls es für Dich eine Option ist, das Tastaturlayout aus dem Batchscript heraus temporär auf en-us umzuschalten, um die Benutzereingabe zu erfassen, schau Dir das mal an.
Gruß
Friemler
Hallo DWW,
doch, man kann das Tastaturlayout auch einfach nur umschalten, mit dem
Der Knackpunkt dabei ist, dass die Scriptzeilen zur Erfassung der Eingabe in einem eigenen (neu erzeugten) Fenster laufen, da die Umschaltung des Tastaturlayouts nur für Fenster wirksam ist, die nach der Umschaltung erstellt werden. Die dort erfassten Eingaben werden deshalb in eine temporäre Datei geschrieben, deren Inhalt im Hauptscript in eine Variable eingelesen und dann ausgewertet wird.
Gruß
Friemler
doch, man kann das Tastaturlayout auch einfach nur umschalten, mit dem
Default
-Attribut des gs:InputLanguageID
-Knotens in der XML-Datei. Anbei ein Beispielscript.@echo off & setlocal
set "KeyboardUS=%TEMP%\KeyboardUS.xml"
set "KeyboardDE=%TEMP%\KeyboardDE.xml"
set "InputFile=%TEMP%\Input.txt"
> "%KeyboardDE%" echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>
>>"%KeyboardDE%" echo ^<gs:UserList^>
>>"%KeyboardDE%" echo ^<gs:User UserID="Current"/^>
>>"%KeyboardDE%" echo ^</gs:UserList^>
>>"%KeyboardDE%" echo ^<gs:InputPreferences^>
>>"%KeyboardDE%" echo ^<gs:InputLanguageID Action="add" ID="0407:00000407" Default="true"/^>
>>"%KeyboardDE%" echo ^</gs:InputPreferences^>
>>"%KeyboardDE%" echo ^</gs:GlobalizationServices^>
> "%KeyboardUS%" echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>
>>"%KeyboardUS%" echo ^<gs:UserList^>
>>"%KeyboardUS%" echo ^<gs:User UserID="Current"/^>
>>"%KeyboardUS%" echo ^</gs:UserList^>
>>"%KeyboardUS%" echo ^<gs:InputPreferences^>
>>"%KeyboardUS%" echo ^<gs:InputLanguageID Action="add" ID="0409:00000409" Default="true"/^>
>>"%KeyboardUS%" echo ^</gs:InputPreferences^>
>>"%KeyboardUS%" echo ^</gs:GlobalizationServices^>
control intl.cpl,, /f:"%KeyboardUS%"
start "" /wait cmd /c "set /p "Input=" & < NUL call set /p "=%%Input%%" > "%InputFile%""
set /p "Input=" < "%InputFile%"
control intl.cpl,, /f:"%KeyboardDE%"
del "%KeyboardDE%"
del "%KeyboardUS%"
del "%InputFile%"
< NUL set /p "=%Input%" & echo(
Der Knackpunkt dabei ist, dass die Scriptzeilen zur Erfassung der Eingabe in einem eigenen (neu erzeugten) Fenster laufen, da die Umschaltung des Tastaturlayouts nur für Fenster wirksam ist, die nach der Umschaltung erstellt werden. Die dort erfassten Eingaben werden deshalb in eine temporäre Datei geschrieben, deren Inhalt im Hauptscript in eine Variable eingelesen und dann ausgewertet wird.
Gruß
Friemler
Hallo DerWoWusste,
ja, getestet und passt. (Hänge ein PAUSE an Friemlers Code an, dann bleibt das Fenster geöffnet.)
Ich weiß nicht was genau du vorhast. Möglich wäre auch
wobei "test.bat" deinen Batch repräsentiert, der dann komplett mit dem US Keyboard Layout laufen würde.
Grüße
rubberman
ja, getestet und passt. (Hänge ein PAUSE an Friemlers Code an, dann bleibt das Fenster geöffnet.)
Ich weiß nicht was genau du vorhast. Möglich wäre auch
@echo off &setlocal
call :changeKL 0409
start "" cmd /c "test.bat"
>nul timeout /t 1 /nobreak
call :changeKL 0407
goto :eof
:changeKL LCID
>"%temp%\config.xml" (
echo ^<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend"^>
echo ^<gs:UserList^>
echo ^<gs:User UserID="Current"/^>
echo ^</gs:UserList^>
echo ^<gs:InputPreferences^>
echo ^<gs:InputLanguageID Action="add" ID="%1:0000%1" Default="true"/^>
echo ^</gs:InputPreferences^>
echo ^</gs:GlobalizationServices^>
)
control intl.cpl,, /f:"%temp%\config.xml"
del "%temp%\config.xml"
goto :eof
wobei "test.bat" deinen Batch repräsentiert, der dann komplett mit dem US Keyboard Layout laufen würde.
Grüße
rubberman
Hallo DWW.
Soweit ich weiß hat M$ das Verhalten unter Win8 geändert (habe hier auf Win7 getestet).
Kürzlich bin ich darüber gestolpert, als ich die WinAPI LoadKeyboardLayout nachgeschlagen habe (die hier wahrscheinlich im Background aufgerufen wird):
Grüße
rubberman
Soweit ich weiß hat M$ das Verhalten unter Win8 geändert (habe hier auf Win7 getestet).
Kürzlich bin ich darüber gestolpert, als ich die WinAPI LoadKeyboardLayout nachgeschlagen habe (die hier wahrscheinlich im Background aufgerufen wird):
Prior to Windows 8: Several input locale identifiers can be loaded at a time, but only one per process is active at a time. Loading multiple input locale identifiers makes it possible to rapidly switch between them.
Beginning in Windows 8: The input locale identifier is loaded for the entire system. This function has no effect if the current process does not own the window with keyboard focus.
Leider habe ich momentan keine Möglichkeit auf Win8 zu testen.Beginning in Windows 8: The input locale identifier is loaded for the entire system. This function has no effect if the current process does not own the window with keyboard focus.
Grüße
rubberman
Hallo.
Da muss ich mich anschließen. Laut TechNet gibt's unter Win8 noch ein Set-WinDefaultInputMethodOverride Cmdlet, aber testen kann ich da aus benannten Gründen leider auch nichts ...
Grüße
rubberman
Da muss ich mich anschließen. Laut TechNet gibt's unter Win8 noch ein Set-WinDefaultInputMethodOverride Cmdlet, aber testen kann ich da aus benannten Gründen leider auch nichts ...
Grüße
rubberman
Moin,
Ich weis nicht ob es in die richtige Richtung geht . Der Input wird abgegriffen und notwendigerweise wie beim us-Keyboard eingegeben angezeigt.
Ein Kleiner Bug ist noch beim Backspace dabei.
Der vorwertige Anführstrich geht noch nicht.
Vielleicht bekommt es jemand hin. ist gefixt
Die Taste [<|>] ganz Links ist abgestellt lässt sich aber anders zuweisen.
Gruß Phil
Ich weis nicht ob es in die richtige Richtung geht . Der Input wird abgegriffen und notwendigerweise wie beim us-Keyboard eingegeben angezeigt.
Der vorwertige Anführstrich geht noch nicht.
Vielleicht bekommt es jemand hin.
Die Taste [<|>] ganz Links ist abgestellt lässt sich aber anders zuweisen.
@echo off
if "%~1" equ "/?" (
echo Eingabe im DE Tastaturlayout - Ausgabe von DE und EN Tastaturlayout &echo(
<nul set/p"=%~n0 "&echo [Dateiname]
echo(&echo( Dateiname Ausgabe wird auch in Datei angefuegt.&echo(
echo(Unterstuetzt Zeichen loeschen
exit /b
)
setlocal disabledelayedexpansion
title lese Keyboard ein ...
rem :initVarout _ # $ . \
chcp 1252 >nul
call :ini_List :: _ # $ .
chcp 858 >nul
:initVars
set "OutxT=3"
set "Input="
set /a n =0
:initXinput
for /f "eol=1tokens=%OutxT%" %%i in (' echo^( ^|xcopy /Liwyq "%~f0" "%temp%\Output-fuer-nichts-tmp\" ') do set /a "OutxT+=1" &goto :initXinput
:initVarout <CR> <BS> _ # $ .
setlocal enabledelayedexpansion
for /f %%+ in ('copy /Z "%~dpf0" nul') do (rem CR
for /f %%- in ('"prompt;$h&for %%i in (1) do rem"') do (rem BackSpace
for /f "delims=" %%_ in ("%L__A%%L__B%") do (
for /f "delims=" %%# in ("%L_#A%%L_#B%") do (
for /f "delims=" %%$ in ("%L_$A%%L_$B%") do (
for /f "delims=" %%. in ("%L_.A%%L_.B%") do (
echo Eingabe ...
endlocal
title Erwarte Eingabe ...
call :Xinput %L__N% %L_#N% %L_$N% %L_.N%
))))))
chcp 1252 >nul
setlocal enabledelayedexpansion
if "%~1" neq "" >>%1 echo EN: !InputEN! DE: !InputDE!
chcp 850 >nul
for /f eol^=^
^ delims^= %%A in ("!InputEN!") do (
for /f eol^=^
^ delims^= %%B in ("!InputDE!") do (
endlocal
echo( DE: %%B
echo( EN: %%A
))
exit /b
rem (title) - exit /b 0 - ERRORLEVEL 0
rem (call) - exit /b 1 - ERRORLEVEL 1
:Xinput
(set "out="
set "in="
for /f "eol=1tokens=%OutxT% delims= " %%A in (' xcopy /Liwyq "%~f0" "%temp%\Output-fuer-nichts-tmp\" ') do (
if %%- equ %%A set "out=del"
if not defined out (if %%+ equ %%A exit /b
set "In=%%A"
for /f eol^=^
^ delims^=%alphanum%%sonder%%multi%^ %%B in ("%%A") do call :xChange %*
) || (set "out=%%A" &set "in=%%A")
)
) || (set "out= " &set "in= ")
if ^%in% equ ^& if not defined pre set "outpre=^" &set "multi=" &set "pre=&" &goto :Xinput
set "multi=euioaEUIOA"
setlocal enabledelayedexpansion
if !out! neq del goto :readinput
if not defined InputEN endlocal &set "InputDE=" &goto :Xinput
cls
:delete
set "inputDE+="
(for /f eol^=^%inputEN:~-1%delims^=%delDach% %%i in ("!inputEN:~-1!.") do set "InputDE=!InputDE:~0,-1!" &:: DE-e
)||(for /f eol^=^%inputDE:~-1%delims^=%delAkzent% %%i in ("!inputDE:~-1!.") do set "InputDE+=ï" & :: DE+´
)||(for /f eol^=^%inputDE:~-1%delims^=%delGravis% %%i in ("!inputDE:~-1!.") do set "InputDE+=`" & :: DE+`
)
set "InputDE=!InputDE:~,-1!!InputDE+!"
(for /f eol^=^
^ delims^= %%A in ("!InputDE!") do (
endlocal
echo(de: %%A
set "InputDE=%%A"
(title)
)
)||(
endlocal
set "InputDE="
)
setlocal enabledelayedexpansion
set "InputEN=!InputEN:~,-1!
(for /f eol^=^
^ delims^= %%A in ("!InputEN!") do (
endlocal
set "InputEN=%%A"
echo(en: %%A
(title)
)
)||(
echo(de:
echo(Erwarte Eingabe ...
endlocal
set "InputDE="
set "InputEN="
title Erwarte Eingabe ...
)
goto :Xinput
:readinput
cls
(for /f eol^=^
^ delims^= %%A in ("!InputDE!!pre!!in!") do (
for /f eol^=^
^ delims^= %%B in ("!InputEN!!outpre!!out!") do (
endlocal
echo(de: %%A
echo(en: %%B
set "InputDE=%%A"
set "InputEN=%%B"
>nul 2>nul title %%A
))
) || (set "InputDE="&set "InputEN=")
set "pre="
set "outpre="
goto :Xinput
:Xchange
rem :initVarout _ # $ .
for %%@ in (.) do (
if defined pre (
for /f delims^=^%in%^ tokens^=1* %%x in ("%%.") do for /f "tokens=%4 delims= " %%z in ("%%y") do set "outpre=" &set "out=%%z"
)
for /f delims^=^%in%^ tokens^=1* %%x in ("%%_") do for /f "tokens=%1 delims= " %%z in ("%%y") do set "out=%%z"
for /f delims^=^%in%^ tokens^=1* %%x in ("%%#") do for /f "tokens=%2 delims= " %%z in ("%%y") do set "out=%%z"
for /f delims^=^%in%^ tokens^=1* %%x in ("%%$") do for /f "tokens=%3 delims= " %%z in ("%%y") do set "out=%%z"
)
if ^%out% neq ^ exit /b 0
if not defined out title ^%in% Nicht gefunden.&exit /b 1
set "out=" &set "in="
exit /b 0
:ini_List {{comment_single_line_remark:4}}
rem Erzeuge Esetzumgsliste
for /f "eol==" %%i in ('"2>nul set ."') do set "%%i="
for /l %%i in (1 1 9) do set ".%%i=."
:List
call :ini_de_en %1%2 L_%2
if "%3" neq "" shift /2 &goto :List
:FullKey
set "alphaNum=1234567890qwrtpsdfghjklxcvbnmQWRTPSDFGHJKLXCVBNM"
set "sonder=%%%%!$.^,"
set "multi=euioaEUIOA"
set "deldach=êûîôâÊÛÎÔÂ"
set "delAkzent=éúíóáýÉÚÍÓÁÝ"
set "delGravis=èùìòàÈÙÌÒÀ"
exit /b ini_List
:ini_De_En Liste wird erstellt
set /a "%2N =0
set "%2A="
set "%2B="
rem 1252 - 3,6 ; 858 - 4,5
for /f "tokens=1* delims=:" %%a in (' ^( set . ^& findstr /LB %1 "%~f0" ^) ^|findstr /nb :') do (
for /f "tokens=3,6 delims= " %%A in ("%%b") do (
if %%A neq %%B if "%%A" neq " " if "%%B" neq "" (
set /a "%2N+=1"
set "%2A%%a=%%A"
call set "%2A=%%%2A%% !%2A%%a!"
if %%A equ . (set "%2B%%a=.") else set "%2B%%a=%%B"
call set "%2B=%%%2B%% !%2B%%a!"
)))
exit /b
rem :initVarout _ # $ .
;: Legende:
;:
;:+--Variablenzuweisung _ # $ .
;: +--VorschaltTaste: N=Normal U=[Umschalt] G=[AltGr]
;: |+--Keyboard Zeile: n=number-Line q=Q-Line(TAB) a=A-Line y=Y-Line
;: | ++--Keyboard Spalte
;: | || +--Keyboard QWERTZ chcp 1252
;: | || | +--CMD in cp 858
;: | || | | +--Out QWERTY [SPACE] --> Kein Zeichen, gleich --> Ausgabe
;: | || | | | +--Out Keyboard QWERTY cp 1252
;: [TAB] [TAB] [TAB] [TAB] [TAB]
;;_ max 30 Liste 1
::_ Nn00 ^ ^ ` `
::_ Un00 ° ø ~ ~
::_ Un01 ! ! ! ! equ
::_ Un02 " " @ @
::_ Un03 § õ # #
::_ Un04 $ $ $ $ equ
::_ Un05 % % % % equ
::_ Un06 & & ^ ^
::_ Un07 / / & &
::_ Un08 ( ( * *
::_ Un09 ) ) ( (
::_ Un10 = = ) )
::_ Nn11 ß á - -
::_ Un11 ? ? _ _
::_ Nn12 ´ ï = =
::_ Un12 ` ` + +
::_ Nq06 z z y y
::_ Uq06 Z Z Y Y
::_ Nq11 ü [ [
::_ Uq11 Ü š { {
::_ Nq12 + + ] ]
::_ Uq12 * * } }
::_ Aq01 @ @ empty
::_ An02 ² ý empty
::_ An03 ³ ü empty
::_ An07 { { empty
::_ An08 [ [ empty
::_ An09 ] ] empty
::_ An10 } } empty
::_ An11 \ \ empty
::_ Aq01 € Õ empty
::_ Aq12 ~ ~ empty
::_ Ay07 µ æ empty
::_ .. . . Listende
;;# max 30 Liste 2
::# Na10 ö ” ; ;
::# Ua10 Ö ™ : :
::# Na11 ä „ ' '
::# Ua11 Ä Ž " "
::# Na12 # # \ \
::# Ua12 ' ' | |
::# Ny00 < < empty
::# Uy00 > > empty
::# Ay00 | | empty
::# Ny01 y y z z
::# Uy01 Y Y Z Z
::# .. . .
::# Uy08 ; ; < <
::# Uy09 : : > >
::# Ny10 - - / /
::# Uy10 _ _ ? ?
;:$ max 30 Liste 2 -aczent
::# ^N ê ˆ Š è
::# ^N û – — ù
::# .. . . Listende
::$ ^N î Œ ì
::$ ^N ô “ • ò
::$ ^N â ƒ … à
::$ ´N é ‚ =e =e
::$ ´N ú £ =u =u
::$ ´N í ¡ =i =i
::$ ´N ó ¢ =o =o
::$ ´N á =a =a
::$ ´N ý ì =z =z
::$ `N è Š +e +e
::$ `N ù — +u +u
::$ `N ì +i +i
::$ `N ò • +o +o
::$ `N à … +a +a
::$ ^U Ê Ò Ô È
::$ ^U Û ê ë Ù
::$ ^U Î × Þ Ì
::$ ^U Ô â ã Ò
::$ ^U Â ¶ · À
::$ ´U É =E =E
::$ ´U Ú é =U =U
::$ ´U Ó à =O =O
::$ ´U Í Ö =I =I
::$ ´U Á µ =A =A
::$ ´U Ý í =Z =Z
::$ `U È Ô +E +E
::$ `U Ù ë +U +U
::$ `U Ì Þ +I +I
::$ `U Ò ã +O +O
::$ `U À · +A +A
::$ .. . . Listende
;;. max 30 Liste 3 pre
::. +& e e ˆ ê
::. +& u u – û
::. +& i i Œ î
::. +& o o “ ô
::. +& a a ƒ â
::. +& E E Ò Ê
::. +& U U ê Û
::. +& I I × Î
::. +& O O â Ô
::. +& A A ¶ Â
::. .. . . Listende
Gruß Phil
Moin,
Schön wenn es nun geht.
Ich hab das Monster noch etwas angefüttert.
Das Verhalten der Englischen Tastatur wird komplett über CMD nachgestellt.
Die [AltGr] Tasten werden ausgelassen.
Akut, Gratis, Zirkumflex sowie verbundene Buchstaben werden unterstützt.
Das € (Eurosymbol) gibt es indirekt über den Umweg der Codepage 858.
Gruß Phil
Schön wenn es nun geht.
Ich hab das Monster noch etwas angefüttert.
Das Verhalten der Englischen Tastatur wird komplett über CMD nachgestellt.
Die [AltGr] Tasten werden ausgelassen.
Akut, Gratis, Zirkumflex sowie verbundene Buchstaben werden unterstützt.
Das € (Eurosymbol) gibt es indirekt über den Umweg der Codepage 858.
Gruß Phil
Moin DWW,
Gruß an Frank seine Forumsoftware oder IE11.
Die Website hat zwei ... drei Sonderzeichen anders dargestellt.
Ich hab das erstellen der Ersetzungsvariablen für die Tastatur auf Codepage 1252 umgestellt, damit die Fehlerhaften Zeichen über Codepage 850/858 hier nicht auf der Website ins Gewicht fallen.
Ich hab den Code testahlber gleich nochmal vom Browser ins CMD kopiert. Nun sollte es ohne Fehler funktionieren.
Auf 8.1 geht es.
Zu starten mit:
Die Ausgabedatei ist Optional
Gruß Phil
Gruß an Frank seine Forumsoftware oder IE11.
Die Website hat zwei ... drei Sonderzeichen anders dargestellt.
Ich hab das erstellen der Ersetzungsvariablen für die Tastatur auf Codepage 1252 umgestellt, damit die Fehlerhaften Zeichen über Codepage 850/858 hier nicht auf der Website ins Gewicht fallen.
Ich hab den Code testahlber gleich nochmal vom Browser ins CMD kopiert. Nun sollte es ohne Fehler funktionieren.
Auf 8.1 geht es.
Zu starten mit:
Input.cmd Augabedatei.txt
Gruß Phil