viewfinder
Goto Top

Wunderwelt CMD, Anfängerfallen, Befehle die nicht funktionieren, Bugs

Auch wenn die Zeit der CMD langsam abläuft, ist es nicht die schlechteste Idee einen Einstieg in das Programieren mit dieser simplem Sprache zu probieren. Das Blut der Wunden trocknet langsam und viele Fehler nach meinen ersten Versuchen sind nicht mehr reproduzierbar. Ein paar Beispiele werde ich nachfolgend zusammen fassen. Mit etwas Glück wird eine Sammlung daraus, für Probleme an die man nicht unendliche Stunden mit sinnloser Recherche verschwenden muß.
edit 02.12.2013
Wer jedoch zur Verarbeitung von multiplen Schriftzeichen, sei es UNICODE, UTF-... oder einfach verschiedenen Codepages verdammt ist, wird mit CMD nicht glücklich.

back-to-topBefehle, Bugs, locale Probleme

back-to-topBefehl "cd /d" mit "%~dp0"

by @Friemler
cd /d "%~dp0"  
Problem und Beschreibung bitte dem Orginalbeitrag unten "Friemler schreibt am 20.12.2012 um 22:15:12 Uhr" entnehmen.

back-to-topCD.. in einer For-Schleife

back-to-topTestsysteme
- windows 7 [Version 6.1.7601] CMDextension 2
back-to-topProblem
Der folgende Code wird hier im Forum in verschiedenen Versionen aufgeführt. Es sollte das nächst höhere Verzeichnis ausgegeben werden. Alle Versuche führten bisher nur zu einer Textwiedergabe.
edit 19.12.2012
set "Dir=%~dp0" ist nur ein etwas unglücklich gewähltes Beispiel. Das Skript liegt in der Regel nicht im selben Verzeichnis, in welchem die Aktion ausgeführt werden soll. Deshalb jetzt wie folgt:
Verzeichnis des Skriptes ist F:\Public\Projects\WWW\testbasis\script-local\exembles
Verzeichnis der AKtion ist F:\Public\Projects\WWW\testbasis\Test
back-to-topBeschreibung
set "Dir=F:\Public\Projects\WWW\testbasis\Test"  
For %%I in ("%Dir%\..") do (  
	echo Verzeichnis ist: %Dir%
	echo ParentDir eventuell: %%I
	)
Ausgabe:
Verzeichnis ist: F:\Public\Projects\WWW\testbasis\Test
ParentDir eventuell: F:\Public\Projects\WWW\testbasis\Test\..
Ersatzlösung:
For %%I in ("%Dir%") do (  
	echo Verzeichnis ist: %Dir%
	set "ParentDir=%%~dpI"  
	)
echo Ersatzloesung ist: %ParentDir:~0,-1%
Ausgabe:
Verzeichnis ist: F:\Public\Projects\WWW\testbasis\Test
Ersatzloesung ist: F:\Public\Projects\WWW\testbasis
back-to-topLösung
gestiftet by @rubberman
Fehler war der fehlender Parameter "f" und etwas Konzentration beim Schreiben.
set "Dir=F:\Public\Projects\WWW\testbasis\Test"  
For %%I in ("%Dir%\..") do (  
	echo Verzeichnis ist: %Dir%
	echo ParentDir ist: %%~fI
	)
Ausgabe:
Verzeichnis ist: F:\Public\Projects\WWW\testbasis\Test 
ParentDir ist: F:\Public\Projects\WWW\testbasis

back-to-topEcho, numerische Werte bei Umleitung der Ausgabe

back-to-topTestsysteme
- windows 7 [Version 6.1.7601] CMDextension 2
- XPSP3 [Version 5.1.2600] CMDextension 2
back-to-topProblem
Es sind streng genommen zwei Probleme die auf Begin und Ende einer Zeile mit einstellig numerischen Wert beruhen.
back-to-topBeschreibung
echo Numerische Werte: Der hochkomplexe Befehl "Echo"  
echo ------------------------------------------------
echo      FIRST - Echo umleiten ohne Anzeige
echo 1 ich werde Sortierte Variable - var 1>%~dp0%~n0.txt
echo 10 ich werde Sortierte Variable - var 2>>%~dp0%~n0.txt
echo 11 ich werde Sortierte Variable - var 11>>%~dp0%~n0.txt
echo Testausgabe 1>>%~dp0%~n0.txt
echo 2 Testausgabe 2>>%~dp0%~n0.txt
(echo 1 ich bin die Loesung - var 1)>>%~dp0%~n0.txt
echo      SECOND - Ausgabe der umgeleiteten Daten
type %~dp0%~n0.txt
del %~dp0%~n0.txt
Ausgabe:
      FIRST - Echo umleiten ohne Anzeige
10 ich werde Sortierte Variable - var 
2 Testausgabe 
      SECOND - Ausgabe der umgeleiteten Daten
1 ich werde Sortierte Variable - var 
11 ich werde Sortierte Variable - var 11
Testausgabe 
1 ich bin die Loesung - var 1
back-to-topLösung
Einfach den "ECHO"- Befehl in Klammer fassen.
edit 19.12.2012
Überraschend einfache Lösung von @rubberman
Wird die Ausgabeumleitung vor den Ausgabebefehl gesetzt, ensteht dieses Problem erst gar nicht.
Lösungsbeispiel
>%~dp0%~n0.txt echo 1 ich bin die Loesung - var 1
>>%~dp0%~n0.txt echo 2 ich kann schreiben was ich will, auch 3

back-to-topIF DEFINED, Variable auf Existens prüfen

back-to-topTestsysteme
- windows 7 [Version 6.1.7601] CMDextension 2
- XPSP3 [Version 5.1.2600] CMDextension 2
back-to-topProblem
Beim durch wühlen des Forums wird dieser Befehl zuweilen verwendet. Dem entsprechend gehen ich davon aus, das es ein locales Problem ist. "DEFINED" ist in der Hilfe enthalten, läßt sich aber nicht ausführen.
edit 19.12.2012
Das Problem ist eigentlich keines, da eine falsche Schreibweise vorliegt. Thanks @rubberman
back-to-topBeschreibung
set "a=ich bin ein a"  
set b=ichbineinB
if not defined "%a%" echo "a" ist nicht definiert, es ist - %a%  
if "%a%" EQU "ich bin ein a" echo Var %%a%% ist definiert.  
if defined "%a%" echo "a" ist definiert, es ist - %a%  
if not defined %b% echo "b" ist nicht definiert, es ist - %b%  
Ausgabe:
"a" ist nicht definiert,es ist - ich bin ein a  
Var %a% ist definiert.
"b" ist nicht definiert, es ist - ichbineinB  
back-to-topLösung
edit 19.12.2012
Lösung von @rubberman
Gefragt wird nach dem Variablenname - und der hat keine Anfuehrungszeichen.
set "myvar=1"  
set myvar
if defined "myvar" (echo "myvar" ist definiert) else echo "myvar" ist nicht definiert  
if defined myvar (echo myvar ist definiert) else echo myvar ist nicht definiert


back-to-topsetlocal disabledelayedexpansion

back-to-topTestsysteme
- windows 7 [Version 6.1.7601] CMDextension 2
- XPSP3 [Version 5.1.2600] CMDextension 2
back-to-topProblem
Nicht nur der Name "Verzögerte Erweiterung" ist etwas unglücklich gewählt. Das Ausschalten der fortlaufenden Manipulation von Variablen innerhalb EINER Funktion gelingt nicht wirklich. Durch die Kennzeichnung mittels "!" ist das Erkennen von veränderlichen Variablen einfach.
back-to-topBeschreibung
Außerhalb des "setlocal" sollten diese Variablen nur als feste %Variablen% zur Verfügung stehen. Die ist leider nicht der Fall. Die Einarbeitung in Skripts dessen Verfasser etwas schlampig war, wird unnötig erschwert.
back-to-topLösung
Es ist kein gravierendes Problem, wenn man sich erst einmal in die Thematik eingearbeitet hat. Ist eine Funktion beendet sollten keine "!" mehr verwendet werden. "setlocal enabledelayedexpansion" am Anfang des Skriptes einschalten und am Ende wieder rausnehmen. Dann muss man sich über ungewollte Nebeneffekte keine Gedanken mehr machen. Wenn diese Funktionalität benötigt wird, verwende ich vorzugsweise folgende Umgebung.
@echo off& setlocal& setlocal enabledelayedexpansion
:ROUTINE
endlocal& setlocal disabledelayedexpansion& goto :eof


back-to-topFunktionen die Probleme bereiten

back-to-topVariablen (numerisch) erstellen und vergleichen

Siegesbewußt mit etwas Grundwissen sollte der Einsatz von simpelster Grundschulmathematik kein Problem sein. Nachfolgend ein zusammengekünsteltes Beispiel.
edit 19.12.2012
Anfängerfehler siehe Lösung
echo Numerische Werte: Variablen vergleichen
echo ---------------------------------------
set /a Startwert=100
set /a Endwert=30
set /a Var=%Startwert%
:LOTTO
setlocal enabledelayedexpansion
for %%I in ("Var") do (  
	set /a N_Lauf+=1
	set /a S+=3
	set /a Var=!Var!+!S!
	echo Durchlauf "!N_Lauf!"; Var ^= !Var!; Summand ^= !S!; Stop bei %Endwert%  
	)
setlocal disabledelayedexpansion
echo Vergleich: "%Var%" LSS "%Endwert%"  
if "%Var%" LSS "%Endwert%" goto :LOTTO  
echo Tolleranz %S%; Endwert %Var%
back-to-topBeschreibung
Das obige Beispiel ist vollkommen sinnfrei und dient ausschließlich zur Verdeutlichung der Probleme. Die Variablen "Startwert" und "Endwert" dienen zum Ausprobieren der Problematik. "Var" simuliert einen Inhalt der aus einem imaginären Skript in die For- Schleife übernommen werden soll. Alle zur Berechnung erforderlichen Variablen wurden zur Sicherheit mit der Option "/a" als numerischer Ausdruck angelegt. ":LOTTO" ist die Sprungmarke zur Wiederholung der Variablenmanipulation und wird durch den Befehl "IF" mittels Vergleich angesteuert. "setlocal enabledelayedexpansion" schaltet die Integrität von Variablen innerhalb einer abgeschlossenen Funktionen aus. Diese Variablen können mit verändertem Inhalt fortlaufend manipuliert werden, ohne das die Funktion beendet werden muss. Zur Verdeutlichung dieser vermeintlichen Wertschöpfung sind variable Variablen innerhalb von Funktionen mit "!" zu kennzeichnen. "FOR %%I ..." ist die eigentliche Berechnungsschleife. Als Befehlssatz und Ausgabewert wird hier "Var" verwendet. "For" ist mit nur einem Wert nicht zwingend erforderlich, also nur Beispiel. Die mit "DO" eingeleiteten Anweisungen können in vorliegendem Beispiel auch ohne "For" ausgeführt werden. Das setzen (set /a) der Variable "N_Lauf" dient der Veranschaulichung der Funktion und bildet die Anzahl der ausgeführten Forschleifen ab. "S" ist der Summand zu "Var" als numerischer Ausdruck dessen Wert durch das "+" zu dem Wert links vom "=" addiert werden soll. "set /a Var=!Var!+!N!" ist die eigentliche Berechnung. "Var" wird neu überschrieben mit der Summe aus "!Var!+!S!". "Var" hat eine neue Integrität. Die "echo"- Zeile verdeutlicht das Ansteigen der Werte durch die Summierung. "setlocal disabledelayedexpansion" beendet die fortlaufende Manipulation von Variablen. Besser gesagt, es sollte dieses tun. Die Variablen können weiter innerhalb von "!!" abgerufen werden. Die Integrität von %Var% liegt eindeuting in der letzten Schleife von "For" und "setlocal ..." zwingt uns die zusätzliche Umgebung (Instanz) an einer geeigneten Stelle zu beenden. Die folgenden Echos sind nur zur Veranschaulichung des mit "if" eingeleiteten Vergleiches. Solange der aus der letzten Schleife eindeutige Wert %Var% kleiner als der eindeutige Wert %Endwert% ist, soll der variabel ansteigende Wert !S! zu %Var% addiert werden. Wie weit sich %Var% von der Realität %Endwert% entfernt, hängt von %S% ab. Dessen Integrität mit !S! in jeder Schleife neu gebildet wird.
So und jetzt kommts. Es funktioniert nicht.
back-to-topProblem
Trotz Kennzeichnung als numerischen Wert vergleicht der Interpreter nur alphabetisch von rechts nach links.
Beispiele: 1=14; 2=23; 43<5
back-to-topLösung
Hier ist eindeutig das erfahrene Semester gefragt. Ich setze Wertvergleiche nur noch als alphabetische Vergleiche ein.
edit 19.12.2012
Lösung @rubberman
Bei numerischen Vergleichen muessen die Vergleichsoperanden auch numerisch sein! Anfuehrungszeichen machen sie natuerlich zu alphanumerischen Zeichenfolgen, da diese mit verglichen werden.
set /a "mynum1 = 11, mynum2 = 5"  
set mynum
if "%mynum1%" leq "%mynum2%" (  
  echo "%mynum1%" ist kleiner/gleich "%mynum2%"  
) else (
  echo "%mynum1%" ist groesser "%mynum2%"  
)
if %mynum1% leq %mynum2% (
  echo %mynum1% ist kleiner/gleich %mynum2%
) else (
  echo %mynum1% ist groesser %mynum2%
)

back-to-topErsetzungen, Varianten

back-to-topPAUSE

Die Befuerchtung das es sich bei "Pause" um eine local deutsche Variante handelt hat sich nicht bestätigt. Deshalt hier statt eines Problemes einfach mal verschiedene Varianten.
back-to-topBlinkender Cursor
by @rubberman
pause>nul
back-to-top"Pause" mittels "SET /p"
by @pieh-ejdsch
set /p =Please press Enter!
back-to-top¨PAUSE¨ als Einleitung von Befehlsverkettungen (Makro)
Erklärungen und Code bitte Originalbeitrag entnehmen
by @rubberman schreibt am 24.12.2012 um 14:14:01 Uhr

back-to-topBefehle ohne mehrsprachigen Support

back-to-topBefehl "SCHTASKS"

found by @Friemler
In der deutschen Ausgabe werden die Optionen zu "SCHTASKS" auch in deutsch erwartet. Jedoch ist es beim französischen Windows 7 Édition Intégrale und einer chinesisch-englischen XP Version wie es sein sollte.
Ausgabebeispiel unter Win XP zu "SCHTASKS /CREATE /?"
	/SC		schudele		Specifies the schudele frequency.
						Valid schudele types: MINUTE, HOURLY,
						DAILY, WEEKLY, MONTHLY, ONCE,
						ONSTART, ONLOGON, ONIDLE.

viel Spaß beim stöbern
in der Hoffnung das sich die Probleme leicht klären
Viewfinder

Content-ID: 195980

Url: https://administrator.de/knowledge/wunderwelt-cmd-anfaengerfallen-befehle-die-nicht-funktionieren-bugs-195980.html

Ausgedruckt am: 28.12.2024 um 00:12 Uhr

rubberman
rubberman 19.12.2012 aktualisiert um 01:52:58 Uhr
Goto Top
Hallo Viewfinder,

für so Einiges gibt es eine einfache Erklärung. Mal kurz als Batchcode zusammen geschrotet:
@echo off &setlocal
echo * %%Dir%%\.. - Modifikator ~f hilft.
set "Dir=%cd%"  
For %%I in ("%Dir%\..") do (  
  echo Verzeichnis ist: %Dir%
  echo ParentDir ist:   %%~fI
)
pause

echo(
echo * Die Umleitung an den Anfang der Zeile zu setzen,
echo    ist immer ein gute Idee (um die Interpretation von 
echo    Ziffern als Stream-Identifier zu verhindern,
echo    aber auch der Lesbarkeit wegen).
>"test.txt" echo 1  
type "test.txt"  
pause

echo(
echo * Das Schluesselwort defined ist in der Hilfe zu IF dokumentiert.
echo    Gefragt wird nach dem Variablenname - und der hat keine
echo    Anfuehrungszeichen.
set "myvar=1"  
set myvar
if defined "myvar" (echo "myvar" ist definiert) else echo "myvar" ist nicht definiert  
if defined myvar (echo myvar ist definiert) else echo myvar ist nicht definiert
pause

echo(
echo * Bei numerischen Vergleichen muessen die Vergleichsoperanden auch
echo    numerisch sein! Anfuehrungszeichen machen sie natuerlich zu
echo    alphanumerischen Zeichenfolgen, da diese mit verglichen werden.
set /a "mynum1 = 11, mynum2 = 5"  
set mynum
if "%mynum1%" leq "%mynum2%" (  
  echo "%mynum1%" ist kleiner/gleich "%mynum2%"  
) else (
  echo "%mynum1%" ist groesser "%mynum2%"  
)
if %mynum1% leq %mynum2% (
  echo %mynum1% ist kleiner/gleich %mynum2%
) else (
  echo %mynum1% ist groesser %mynum2%
)
pause
echo(
echo * PAUSE mal anders:
pause>nul|set /p "=press any key to see nix mehr ..."&echo(  

Für die Erklärung, warum die "Verzögerte Variablenerweiterung" gar nicht so missverständlich ist, da sie tatsächlich verzögert ausgeführt wird, empfehle ich Die Geheimnisse des Batch Zeilen Interpreters.

Grüße
rubberman
Viewfinder
Viewfinder 19.12.2012 aktualisiert um 15:19:42 Uhr
Goto Top
Hallo rubberman
heute Abend habe ich wieder ein Windows unter den Fingern und freue mich auf Deine Beispiele. Beim Numerischen Vergleich blättert das Holz von der Stirn und Dein Link ist super interessant. ¨Geheimnisse¨ schon beim Frühstück lassen den Tag gut anfangen.
Hinsichtlich der Pause ist weniger die Schreibweise, sondern mehr der Befehl ¨PAUSE¨ global gemeint. Ich habe hier nur ein rein deutsches Windows7 und ein chinesisch-englisch XP-SP3 zum Testen. Es steht für mich die Frage ob ¨PAUSE¨ beispielsweise auf einem französischem oder russischem System wirklich existiert und oder einen Fehler auslöst.

Alles andere heute Abend
mfg
Viewfinder

Ps:
Es ist Abend:
Schade das ich diesen Artikel nicht schon eher geschrieben habe. Haette ne Menge geändert.
Bei der "CD.."- Variante in "FOR" habe ich die Voraussetzungen geändert. Sorry, es sitzt eben noch nicht alles.
"setlocal disabledelayedexpansion" schaue ich mir noch einmal genauer an. Denn ich bin immer noch der Meinung, das Variablen zwischen Ausrufezeichen nach Abschalten der Erweiterung nicht mehr existieren dürften.
Falls Du noch mal reinschaust, gleich noch eine weitere Frage. Was ist ein "Stream" oder "Stream-Identifier" bei CMD?
rubberman
rubberman 19.12.2012 aktualisiert um 19:43:17 Uhr
Goto Top
Hallo Viewfinder,

fangen wir mal mit PAUSE an. Diverse Befehle gibt es schon solange ich mich zurück erinnern kann. Pause gehört sicher dazu (und daran wird sich wohl auch bis zum endgültigen Tod von Batch nichts mehr ändern). Ich habe bisher noch nicht gehört, dass es bei der gleichen Windowsversion in unterschiedlichen Sprachen andere Befehle gibt. Bei unterschiedlichen Windowsversionen sieht das schon anders aus. Während sich die internen Methoden der cmd.exe seit NT nicht geändert haben (zumindest fällt mir nichts ein), gibt es immer mal wieder neue externe Kommandozeilentools oder andere fallen weg. Auf Anhieb denke ich da an ICACLS, SCHTASKS, CHOICE, WMIC und ROBOCOPY (ohne Anspruch auf Vollständigkeit), die auf unterschiedlichen Windowsversionen mal vorhanden sind und mal nicht.
Einen Überblick über interne und externe Befehle gibt dir dieser kurze Code, der allerdings nur die Befehle berücksichtigt, die HELP beinhaltet:
@echo off &setlocal

set /a int=0, ext=0
for /f %%i in ('help^|findstr /rbc:"[A-Z][ABCDEFGHIJKLMNOPQRSTUVWXYZ]"') do (  
  for /f "tokens=1,2 delims=?" %%j in ("%%i.exe?%%i.com") do (  
    if "%%~$PATH:j%%~$PATH:k"=="" (  
      call :out %%i
    ) else (
      set /a ext+=1
      echo %%i "%%~$PATH:j%%~$PATH:k"  
    )
  )
)

echo(
echo internal %int%
echo external %ext%
pause>nul
goto :eof

:out
set /a int+=1
set "line=%1                                                  "  
echo %line:~,50% - internal
goto :eof

Dein Problem mit der verzögerten Variablenerweiterung verstehe ich noch nicht so ganz. Wenn Variablennamen in Ausrufezeichen eingefasst zum Wert aufgelöst werden sollen, dann bedingt dies die eingeschaltete verzögerte Variablenerweiterung (EnableDelayedExpansion). Per Standard (Einstellung in der Registry) ist sie allerdings zumeist ausgeschaltet (DisableDelayedExpansion).

Sorry, wenn ich manchmal ins Englische abschweife (ich habe wohl tagsüber zu viel damit zu tun). Mit Streams meine ich Datenströme von/zu Dateien oder Geräten. Die wichtigsten Streams sind StdIn (0), StdOut (1) und StdErr (2).
StdIn ist der eingehende Datenstrom, oft per Umleitung aus einer Datei mit dem Zeichen < genutzt.
0<"test.text" more
Ich habe die 0 mal mit geschrieben, obwohl sie per Default herangezogen würde (wie man bei eingeschaltetem Prompt sieht).
StdOut ist die normale Befehlsausgabe, StdErr die Ausgabe von Fehlermeldungen. Auch dazu ein Beispiel:
@echo off &setlocal
echo *1 ohne Umleitung----------------------------
echo(
dir :#
echo(
echo *2 stdOut umgeleitet-------------------------
echo(
1>nul dir :#
echo(
echo *3 stdErr umgeleitet-------------------------
echo(
2>nul dir :#
echo(
echo *4 beide Streams umgeleitet------------------
echo(
1>nul 2>&1 dir :#
echo(
echo ---------------------------------------------
pause
Auch hier habe ich die 1 mitgeschrieben, obwohl nicht nötig.
Die Streams 3 - 9 sind benutzerdefiniert, bzw. werden bei Bedarf herangezogen. Das genauer zu verdeutlichen sprengt den Rahmen, erklärt aber das Verhalten bei Ziffern vor Umleitungszeichen.

Hoffe das hilft etwas.

Grüße
rubberman
Viewfinder
Viewfinder 20.12.2012 aktualisiert um 05:19:21 Uhr
Goto Top
Guten Morgen rubberman,
weitere Löscher sind geschlossen. Es hilft gewaltig. In meinem Umfeld bin ich der Einäugige und auf Internetrecherche angewiesen. Diese haben nicht unbedingt das Format Deiner Antworten.
- "Pause" geht jetzt zu den Akten, da sich der Verdacht, das es sich um eine regionale Komponete handelt, nicht bestätigen läßt.
- "setlocal disabledelayedexpansion" wandert ebenfalls zu den Akten, da das Einschalten aus meiner Sicht keine Probleme verursacht, solange man berücksichtigt das !Var! und %Var% weder vom Inhalt noch als Variable das Selbe sind.
- "Echo - hochkomplex" geht mit ins Archiv. Ich habe die Umleitung (Stream) nicht gesehen. Hervorragende Erklärung deinerseits.
- "IF DEFINED" ist abgehakt wegen Blindheit. (falsche Schreibweise)
- "Variablen (numerisch)" sollte unter Peinlichkeit eingetragen werden. (falsche Schreibweise)

Falls Du noch Lust und Zeit hast, wäre ich für die Klärung folgender Fragen dankbar:

"CD.."- Abwandlung
Ich gehe davon aus das es sich um eine Variante des CD- Befehles handelt. Das Skript befindet sich in der Regel nicht im selben Verzeichnis in welchem der jeweilige Befehl ausgeführt werden soll. Das zu bearbeitende Objekt, wird als Variable mit kompletten Pfad geliefert. Der normale "CD"- Befehl geht nach meinem Verständnis von %~dp0 aus. Also dem Verzeichnis in welchem das Skript liegt. Diese ist aber nicht identisch mit dem Verzeichnis des zu betrachtenden Objektes. Das Objekt ist ein Verzeichnis. Sorry für die erste missverständliche Anfrage. Ich hoffe es ist jetzt besser verständlich und nervt nicht.
set "Dir=F:\Public\Projects\WWW\testbasis\Test"  
For %%I in ("%Dir%\..") do (  
	echo Verzeichnis ist: %Dir%
	echo ParentDir eventuell: %%I
	)
Die Verwendung von \.. taucht in diesem Zusammenhang des öfteren in diesem Forum auf. Ich bekomme jedoch nur F:\Public\Projects\WWW\testbasis\Test\.. zurück. Wie der Code erwarten läßt, einen reinen Text. Setze ich folgendes ein,
set "Dir=F:\Public\Projects\WWW\testbasis\Test"  
For %%I in ("%Dir%") do (  
	set "ParentDir=%%~dpI"  
	echo ParentDir ist: %ParentDir:~0,-1%
	)
ist die reine Ausgabe, abgesehen davon das ich je nach Verwendung ein bis zwei Variablen mehr benötige, kein Problem. Leider setzt der Parameter %~d ein Laufwerk voraus. Genau hier schwimme ich. Sollte es sich um einen Netzwerkpfad handeln, ist das Ergebnis für mich nicht kalkulierbar. For %%I in ("%Dir%\..") do (...) könnte dieses Problem theoretisch umgehen. Doch dieser Befehlssatz funktioniert bei mir nicht.

Abfrage von Befehlen
Mein Gedanke als ich mit diesem Thema angefangen habe war, es mit logischen Operatoren zu versuchen.
echo interne Befehle: IF; MD; RD
echo Programme: icacls; sort; whoami; xcopy
IF /?>NUL && echo IF; vorhanden
IF /?>NUL || echo IF; NICHT vorhanden
MD /?>NUL && echo MD; vorhanden
MD /?>NUL || echo MD; NICHT vorhanden
icacls /?>NUL && echo icacls; vorhanden
icacls /?>NUL || echo icacls; NICHT vorhanden
RD /?>NUL && echo RD; ist vorhanden
RD /?>NUL || echo RD; ist NICHT vorhanden
SORT /?>NUL && echo SORT; ist vorhanden
SORT /?>NUL || echo SORT; ist NICHT vorhanden
whoami /?>NUL && echo Whoami; vorhanden
whoami /?>NUL || echo Whoami; NICHT vorhanden
XCOPY /?>NUL && echo XCOPY; vorhanden
XCOPY /?>NUL || echo XCOPY; NICHT vorhanden
Da nicht nur Du den unveränderlichen Bestand der internen Befehle bestätigst, scheint die mir konfuse Ausgabe zu den internen Befehlen kein Problem. Die von Dir präsentierte Variante liefert eine zuverlässige Aussage für alle Befehle. Gestatte mir bitte ein paar Verständnisfragen.
FINDSTR
- "/rbc:" Du verwendest die Optionen /r /b /c: fortlaufend mit nur einem Schalter. Läßt sich das auf alle Befehle anwenden?
- "reguläre Ausdrücke" Schön, das ich endlich mal ein Beispiel habe. Du verwendest [A-Z] und anschließend [ABCDEFGHIJKLMNOPQRSTUVWXYZ]. Dient diese Dopplung der Sicherheit oder gibt es andere Gründe?
- "for /f "tokens=1,2 delims=?" Diese zweite Schleife bekommt die Ausgabe von "help" bis zum ersten Leerzeichen geliefert. Nach meinem Verständnis gibt es dem folgend kein zweites Token und keinen Delimiter. Was ist tokens=2? Was ist delims=? face-wink Frage hat sich soeben mit dem Befehlssatz ("%%i.exe?%%i.com") erledigt. Ich lese noch zu langsam. Der Rest wird schlagartig klar.
Danke für das gute Beispiel.

Grüße
Viewfinder
rubberman
rubberman 20.12.2012 aktualisiert um 19:26:01 Uhr
Goto Top
Hallo Viewfinder,

Zu CD & Co.:
Oben hatte ich dir schon etwas zu %%~fI erklärt. Setze das mal in deinem Beispiel um:
set "Dir=F:\Public\Projects\WWW\testbasis\Test"  
For %%I in ("%Dir%\..") do (  
	echo Verzeichnis ist: %Dir%
	echo ParentDir eventuell: %%~fI
	)

Es gibt einen gravierenden Unterschied zwischen %cd% und %~dp0 (abgesehen davon dass bei letzterem ein angehängter Backslash mitgeliefert wird).
In der Variablen %cd% findest du das derzeitige Arbeitsverzeichnis (und das könnte bereits durch den Aufruf oder per CD / PUSHD verändert worden sein).
Das Argument %0 beinhaltet den eigenen Aufruf, somit wird %~dp0 immer zum Verzeichnis expandiert in dem der Batch liegt.
Die virtuellen Verzeichnisse . und .. repräsentieren das derzeitige und das Parent-Verzeichnis. Angenommen das derzeitige Arbeitsverzeichnis ist C:\a\b\c\d und du möchtest auf relativem Weg in C:\a\b\y\z wechsel, dann ginge das per
cd ..\..\y\z
Letztlich scheint mir das aber gar nicht dein Problem zu sein. Du sagst du bekommst den gesamten Pfad als Variable. Das einzige was dich ausbremst, ist die Tatsache dass du auch das Laufwerk wechseln müsstest. Wenn das so sein sollte hilft dir sicherlich ein
CD /D "%pfad%"
Schau mal in die Hilfe zu CD face-wink


- "/rbc:" Du verwendest die Optionen /r /b /c: fortlaufend mit nur einem Schalter. Läßt sich das auf alle Befehle anwenden?
Nein. Nur FINDSTR und XCOPY fallen mir auf Anhieb ein. Hängt davon ab, wie das parsen der Optionen in den einzelnen Kommandozeilentools implementiert wurde.

- "reguläre Ausdrücke" Schön, das ich endlich mal ein Beispiel habe. Du verwendest [A-Z] und anschließend [ABCDEFGHIJKLMNOPQRSTUVWXYZ]. Dient diese Dopplung der Sicherheit oder gibt es andere Gründe?
Leider ist der Support für reguläre Ausdrücke mehr als dürftig und auch noch fehlerhaft. [A-Z] sollte ja eigentlich nur die Großbuchstaben matchen. Pustekuchen!, Kleinbuchstaben werden damit von FINDSTR ebenso gematcht. Die von mir gebrauchte Kombination matcht also einen Buchstabe am Zeilenanfang, gefolgt von einem Großbuchstabe. Wenn du dir die Ausgabe von HELP ansiehst, wirst du feststellen, dass dies nur in den Zeilen mit den Befehlen der Fall ist.

Grüße
rubberman
Friemler
Friemler 20.12.2012 aktualisiert um 22:17:47 Uhr
Goto Top
Hallo rubberman, hallo viewfinder,

es gibt ein nettes Schmankerl bei der Verwendung von pushd "%~dp0" in Batchfiles (mit cd /d "%~dp0" funktioniert das nicht):

Wenn ein Batchfile auf einer Netzwerkfreigabe liegt und von dort gestartet wird, um mit Dateien/Verzeichnissen zu arbeiten, die ebenfalls auf der Netzwerkfreigabe liegen, kommt folgende Fehlermeldung:
"\\Server\Freigabe"
CMD.EXE wurde mit dem oben angegebenen Pfad als aktuellem Verzeichnis gestartet.

UNC-Pfade werden nicht unterstützt.
Stattdessen wird das Windows-Verzeichnis als aktuelles Verzeichnis gesetzt.
Die nachfolgenden Befehle finden dann ihr Ziel nicht, da, wie die letzte Zeile der Meldung schon sagt, das lokale Windows-Verzeichnis zum aktuellen Verzeichnis gemacht wurde.

Durch das Einbauen von
pushd "%~dp0"
als erste Zeile (ggf. nach einem @echo off & setlocal) kommt obige Fehlermeldung immer noch, die Netzwerkfreigabe wird aber automatisch als Laufwerk Z: gemountet und zum aktuellen Verzeichnis gemacht - et voilà, das Script hat Zugriff auf die Dateien/Verzeichnisse auf der Netzwerkfreigabe. face-smile

Nachdem das Script seine Arbeit getan hat, hebt ein
popd
das mounting der Netzwerkfreigabe wieder auf.


Zum Thema lokalisierte Konsolenbefehle: SCHTASKS ist ein unrühmliches Beispiel für einen übereifrigen Übersetzer-(Praktikanten face-wink). Wenn mit SCHTASKS /CREATE ein geplanter Task erstellt werden soll, kann mit dem Parameter /SC ein Trigger bzw. Zeitplan definiert werden. Für die tägliche Ausführung muss man nun tatsächlich TÄGLICH angeben, nicht etwa DAILY. Mir ist nicht bekannt, ob auch bei nicht-deutschen Windowsausgaben dieser Parameter übersetzt wurde, man sollte aber damit rechnen. Durch das in TÄGLICH enthaltene Ä ergibt sich außerdem das Problem, dass man Batchfiles, in denen man diesen Befehl verwenden möchte, mit einem Editor erstellen muss, der Dateien in der Codepage OEM850 erstellen und speichern kann. Wenn mit ANSI-Kodierung gespeichert wird, kommt es bei der Ausführung zu einem Fehler, da der ANSI-Code für Ä in der von CMD verwendeten Codepage OEM850 einem anderen Zeichen zugeordnet ist.

@Viewfinder: Batchscript ist ein Minenfeld. Anyway - Happy coding!

Gruß
Friemler
rubberman
rubberman 20.12.2012 um 23:50:11 Uhr
Goto Top
Hallo Friemler,

mit PUSHD und POPD arbeite ich oft. Dass man aber auf diese Weise Netzlaufwerke mounten kann, war mir gänzlich neu. Bislang habe ich die Servershares per NET USE einem Laufwerksbuchstaben zugeordnet um einigermaßen sicher arbeiten zu können.
Werde ich bei nächster Gelegenheit mal testen. Danke in jedem Fall für die Info face-smile
SCHTASKS ist wirklich schon fast eine Frechheit. Durch Lokalisierung wird einem mit Batch sowieso schon das Leben schwer gemacht. In der Firma haben wir einen bunten Mix aus englischen und deutschen Versionen. Da fängt es beim Datumsformat an und hört bei der Verarbeitung von Befehlsausgaben auf. Von den unterschiedlichen Codepages zu schweigen. Dass M$ nun aber auch noch die Optionen der Befehle lokalisiert, ist unterirdisch face-sad
Wie schon geschrieben, ist mir zum Glück noch nicht untergekommen, dass der Befehl selbst lokalisiert wurde. Wenn irgendwann aus FOR Schleifen FÜR Schleifen werden sollten, schmeiß ich den Rechner an die Wand.

BTW: Weißt du woher die Übersetzungen gezogen werden? Im Fall von SCHTASKS finden sich nur die englischen Begriffe in der exe Datei selbst. Da Strings für die Ausgabe im Allgemeinen auch dort im Klartext lesbar sind, war ich etwas erstaunt nicht ein einziges deutsches Wort zu finden. Gleiches gilt auch für andere Commandtools.

Grüße
rubberman
Viewfinder
Viewfinder 21.12.2012 aktualisiert um 11:40:00 Uhr
Goto Top
Hallo @rubberman
bei googlebooks bin ich im Zusammenhang mit regulären Ausdrücken innerhalb von CMD auf eine ähnliche Meinung gestossen. Sie läßt sich mit "15 Minuten und ein halbes Leben" kurz interprätieren. Da als nächstes PHP und Javaskript auf dem Programm stehen, frage ich besser bei Bedarf und Unsicherheit im Forum nach, als mich darin zu vertiefen.

Die CD-Geschichte war eher eine Vermutung zu der folgenden Schreibweise
for %%I in ("Path\..") do echo ParentDir ist %%I  
Bin gleich zurück, auf der Konsole funktioniert es mit Parameter "f". Ohh Man, wärest Du eine Frau würde ich Dir jetzt Blumen schicken. So stehen Dir nur ein Biere zur Auswahl, wenn wir uns über den Weg laufen. Bitte Akzeptiere meine Entschuldigung. Ich habe keine Ahnung wo der Hänger war.
for %%I in ("Path\..") do echo ParentDir ist %%~fI  
läuft sauber und sattelfest. Du hast hier einen Berg an Pappier vom Tisch gefegt. Sorry für die Blockade und riesen Dank für Gedult und Hilfe.

Grüße
Viewfinder


Hallo @rubberman
bisher habe ich das viertuelle Laufwerk (ich lese des öfteren die Hilfe) mehr zur Sicherheit verwendet als unter dem von Dir genannten Auspekt. Diese Tatsache wird natürlich umgehend zu
pushd "%~dp0"  
korrigiert. Ich habe des Interesses wegen auf meiner XP-Leiche mal
SCHTASKS /CREATE /?
eingetippt. Das ist nen englisch - chinesisches System. Wobei China hier "nur" beim booten eine Rolle spielt. CMD rennt eindeutig in englisch.
Ausgabe:
	/SC		schudele		Specifies the schudele frequeny.
						Valid schudele types: MINUTE, HOURLY,
						DAYLY, WEEKLY, MONTHLY, ONCE,
						ONSTART, ONLOGON, ONIDLE.
Ich habe das mal brav abgeschrieben, da dieses Netbook unter Quarantäne steht. Bitte nicht auf Leerzeichen festlegen. Aus Neugier habe ich mir das ganze unter meinem rein deutschem Win7 ebenfalls ausgeben lassen. Das war kein Praktikant. Stündlich und Wöchentlich lassen an Deutschkenntnissen nicht zweifeln. Eine recht eigensinnige Frage kommt mir bei dem Thema hoch. Domäne und Autorität werden schon von Haus aus als Standardleckerbissen mitgeliefert. Solange ich die Dinge wie Domainzugehoerigkeit und Username nur mit Variablen handle ist alles ok. Doch was mache ich, wenn ich diese Angaben in einer Datei speichern und wieder auslesen muss?
Ich hoffe das das kein Geheimnis einer MS-Supporthotline ist.
Zitat von @Friemler:
...
@Viewfinder: Batchscript ist ein Minenfeld. Anyway - Happy coding!
...
CMD ist nur der Einstieg in die Thematik Programierung. Ich kann mir ein paar Werkzeuge basteln und sehe ein wenig wo die Probleme liegen können. Im Verhältnis zum Thai-Alphabet und seinen tollen Regeln in Betonung und Schreibweise ist Microsoft fast durchweg auf der logischen Seite. Ich hoffe das in anderen Programiersprachen einiges besser zu lösen ist, ohne ständig um Infusion zu betteln.

Grüße
Viewfinder
pieh-ejdsch
pieh-ejdsch 21.12.2012 um 10:59:33 Uhr
Goto Top
moin viewfinder,

für die Pause zur Bestätigung, schreibt die Mehrheit Pause der Lesbarkeit halber im Script so hin.
In etwa wie bei der Erstellung einer 0-byte Datei.
echo please Press Enter ...
pause >nul

type nul>0-byteFile
Ob es Lesbarer für Dich ist musst Du natürlich selbst entscheiden.
Der Befehl Pause möchte aber anyKey gedrückt haben, die Taste gibt es ja bekannntlich fast überall auf der Tastatur.
Dazu benötigt es aber keiner zusätzlichen Verschwendung einer Variable oder gar mehreren CodeZeilen:
set /p =Please press anyKey!
Tatsächlich prüfst Du auf Enter leider nur mit Verschwendung einer Variable:
set /p x=Please press Enter! &&echo you have pressed anyKey [more than Enter] ...|| echo you only have entered.



Gruß Phil
rubberman
rubberman 21.12.2012 aktualisiert um 14:03:30 Uhr
Goto Top
Hallo Viewfinder.

Zitat von @Viewfinder:
Doch was mache ich, wenn ich diese Angaben in einer Datei speichern und wieder auslesen muss?
Ich hoffe das das kein Geheimnis einer MS-Supporthotline ist.
Nein, ist kein Geheimnis. Wie du aus der Hilfe zu SCHTASKS /CREATE entnehmen kannst, gibt es die Option /XML. Dort kannst du eine XML Datei mit den entsprechenden Settings angeben.
Mehre Beispiele für so eine XML Datei finden sich im MSDN. Eines davon:
Daily Trigger Example (XML) (Windows)
So muss der Aufbau aussehen.

Weiterhin ist auch das Schema im MSDN zu finden, in dem du die Namen aller Knoten und Kindknoten findest (wie gesagt das Schema, nicht die XML Datei!).
Task Scheduler Schema (Windows)

Wenn dir das zu kompliziert ist, besteht natürlich immer die Möglichkeit die Wert in eine simple Textdatei zu speichern und vor dem Ausführen von SCHTASKS auszulesen und in Variablen zu packen.
Ich baue solche Dateien dann gerne (ähnlich INI) in der Form <Name>=<Wert> auf. Das macht das Leben einfacher.
Beispiel:

values.txt
name=rubberman
age=40

read.bat
@echo off &setlocal
for /f "usebackq delims=" %%i in ("values.txt") do set "%%i"  
echo %name%
echo %age%
pause

Grüße
rubberman
Friemler
Friemler 21.12.2012 aktualisiert um 22:36:04 Uhr
Goto Top
Hallo rubberman,

Zitat von @rubberman:
Wenn irgendwann aus FOR Schleifen FÜR Schleifen werden sollten, schmeiß ich den Rechner an die Wand.

face-big-smile D'accord!


Zitat von @rubberman:
BTW: Weißt du woher die Übersetzungen gezogen werden?

Im Falle von SCHTASKS ist es unter einem deutschen Win 7 Ultimate die Datei
C:\Windows\System32\de-DE\schtasks.exe.mui
In dem Verzeichnis liegen auch für alle anderen Konsolenprogramme die entsprechenden Dateien. Die Strings liegen dort, wie es aussieht, in der Codierung UCS-2 Little Endian vor...

Ich habe mir mal die Hilfe zu SCHTASKS auf einem französischen Windows 7 Édition Intégrale (das ist übrigens im Rest der Welt ein Windows 7 Ultimate, MS kann immer noch einen draufsetzen face-big-smile) angeschaut. Dort muss bei /SC zur täglichen Ausführung DAILY angegeben werden. Da wurde anscheinend nur das deutsche Windows verhunzt, wenn sogar die Grand Nation sich darauf einlässt, an dieser Stelle englische Begriffe zu verwenden.

Gruß
Friemler
Friemler
Friemler 21.12.2012 aktualisiert um 21:44:44 Uhr
Goto Top
Hallo Viewfinder,

die schreiben tatsächlich
DAYLY
in ihrer Hilfe? Sind die Entwickler von MS schon des englischen nicht mehr mächtig? face-surprise

[EDIT]
Ach nee, Du hast es abgetippt und warst wahrscheinlich zu schnell. face-wink
[/EDIT]

Gruß
Friemler
rubberman
rubberman 22.12.2012 um 03:23:58 Uhr
Goto Top
Hallo Friemler,

danke für die Info!
BTW: Da unsere französischen Nachbarn sich tapfer weigern englisch zu lernen, wird M$ keinen Übersetzer gefunden haben face-big-smile

Grüße
rubberman
Viewfinder
Viewfinder 22.12.2012 um 12:01:51 Uhr
Goto Top
Hallo rubberman
das war das beste was M$ passieren konnte. Die deutsche Eifrigkeit macht keinen guten Eindruck.

Hallo Friemler,
sorry fürs falsch tippen, ich mag diesem NOT-book nicht zu nahe kommen und mein Englisch ist in Asien developed. Hier nimmt man es nicht so genau.

Hallo Phil,
Zitat von @pieh-ejdsch:
...
Tatsächlich prüfst Du auf Enter leider nur mit Verschwendung einer Variable:
...
MM jo, 20 Jahre Microsoft. Da ist man nicht mehr kleinlich. face-wink Ich bin davon ausgegangen, das der Befehl SET /P eine Variable und Enter erwartet. Da ist Deiner Variante um einiges performanter.


Morgen räume ich oben auf und bringe die Beiträge ein. Muß jetzt auf den Markt. Da gibt es keine Bytes nur Bahts.
schönen Abend allseits
Viewfinder
rubberman
rubberman 23.12.2012, aktualisiert am 24.12.2012 um 00:07:12 Uhr
Goto Top
Hallo Viewfinder.

Zitat von @Viewfinder:
Blinkender Cursor
by @rubberman

Naja, eigentlich hatte ich dir in meinem ersten Post eine personalisierbare Inlinelösung angeboten. Man könnte es sogar noch auf die Spitze treiben:
@echo off &setlocal
:: initialisiere das Pause - Makro
set "pause=for /l %%i in (1 1 2) do if %%i==2 (setlocal EnableDelayedExpansion&pause>nul|set /p "=!str!"&echo(&endlocal&endlocal) else setlocal&set str="  

:: Test
%pause% Hallo Welt!
%pause% Das ist ein Test.
face-wink

Grüße
rubberman
Viewfinder
Viewfinder 24.12.2012 um 12:13:24 Uhr
Goto Top
Hallo rubberman
un wat fürn Test face-wink
Das Dir der blinkende Cursor zu billig ist, habe ich mir schon gedacht. Jetzt darf ich mir FOR /L anschauen, bevor ich verstehe was Du in die Variable Pause packst. Das schaffe ich heute aus drei Gründen nicht mehr.
- Unter dem von Dir abgeräumten Papier lag noch mehr. Hat nichts mit Batch zu tun.
- Meine Partnerin schaut argwöhnisch.
- Es ist Weihnachten.

Ich wünsche Dir ein Frohes Fest
und allen anderen natürlich ebenfalls

PS.: Den Tip, benötigte Variablen in der auszulesenden Datei zu definieren anstatt mit SET, habe ich ebenso wenig überlesen, wie den Hinweis mit der XML-Datei. XML wird für mich erst mit PHP interessant. Dann steht auch schtasks wieder auf dem Plan, sofern ich cronjobs auf Windows testen muss. Es gibt noch einiges an Fragen, doch jetzt muss ich zwei Tage lächeln.
rubberman
rubberman 24.12.2012 um 14:14:01 Uhr
Goto Top
Hallo Viewfinder,

auch dir ein frohes Fest und allen Mithelfern und Mitlesern.
BTW: Diesen argwöhnischen Blick kenne ich gut. Der bescheint mich auch immer, wenn ich wieder mal mit dem Netbook auf den Knien daneben sitze. Wenn ich dann in den Spiegel sehe, wundere ich mich jedes mal warum ich einseitig Sonnenbrand im Gesicht habe face-big-smile

Aber zum Thema. Eigentlich ist eine personalisierbare Pauseausgabe es nicht wert so viel Aufwand zu betreiben. Andererseits ist es ein Beispiel dafür, wie man mit einem Stück Batchcode in einer Variablen arbeiten kann. Keine Mensch kann aber von dir verlangen, dass du aus dieser zusammengequetschten, völlig unleserlichen Zeile irgendwie schlau wirst (und ich will dir nicht einfach irgendwas vor die Füße werfen á la friss oder stirb). Ich versuch mal etwas Licht ins Dunkel zu bringen.
Ausgangscode war diese Zeile:
pause>nul|set /p "=press any key ..."&echo(
Die Funktionsweise ist simpel. Die Ausgabe von PAUSE wird ins Nirvana geschickt, wobei die Funktionalität (auf eine beliebige Taste zu reagieren) erhalten bleibt. Gleichzeitig wird über die Pipe das SET /P aktiviert, dass den personalisierten Text ausgibt (BTW hat eigentlich schon mal jemand diese Any Key Taste gefunden? face-big-smile). Nach Tastendruck ist noch ECHO( verknüpft, das an die Ausgabe von SET /P, die ohne Zeilenumbruch kommt, einen ebensolchen anhängt.

Wenn du nun das Ganze in ein Makro packen willst, gibt es ein Problem: Dein benutzerdefinierter Text steht mitten in der Zeile. Entweder du teilst das Makro in 2 Variablen oder du lässt dir was einfallen. In diesem Fall hat sich @jeb-the-batcher etwas einfallen lassen und eine FOR /L Schleife verwendet. Somit steht eine SET Anweisung am Ende der Zeile, die deinen Text einer Variablen zuweist. Im zweiten Durchlauf der Schleife wird mit dieser Variablen weiter gearbeitet. Ich drösel mal den Einzeiler zu einem Mehrzeiler auf, um den Code lesbar und erkärbar zu machen.
Die Zeile %pause% Hallo Welt! sieht dann etwa so aus:
for /l %%i in (1 1 2) do if %%i==2 (
  setlocal EnableDelayedExpansion
  pause>nul|set /p "=!str!"  
  echo(
  endlocal
  endlocal
) else setlocal &set str= Hallo Welt!
Nun wird es klarer. FOR /L %%i IN (Start Step Stop) DO... führt also dazu, dass %%i nacheinander die Werte 1 und 2 zugewiesen bekommt. Das nachfolgende IF sorgt dafür, dass zuerst der ELSE Zweig mit der SET Anweisung abgearbeitet wird.
Bleibt noch die Frage nach den SETLOCAL und ENDLOCAL offen. Das erste SETLOCAL (im ELSE Zweig) setzt eine neue Subumgebung und verhindert, dass eine Variable str überschrieben wird, falls sie bereits vorher existiert haben sollte. Das zweite SETLOCAL aktiviert die verzögerte Variablenerweiterung, um mit str auch weiterarbeiten zu können. Die beiden ENDLOCAL stellen den Originalzustand wieder her.

Bevor daraus noch eine mehrseitige Weihnachtsgeschichte wird, hör ich mal lieber auf. Falls Interesse besteht (evtl. auch wie man ein Multiline-Makro erstellt), könnt ihr ja fragen ... face-wink

Grüße
rubberman
Viewfinder
Viewfinder 27.12.2012, aktualisiert am 28.12.2012 um 00:19:11 Uhr
Goto Top
Hallo rubberman,
...¨Any Key¨... noch nicht ganz, aber nahe dran. Stell Dir vor in Deinem Laptop wird ein Mainboard am Verbraucher getestet. Das Teil fackelt ab und in einer Woche ist die Lieferung des offenen Projektes fällig. Du bist in einer Kleinstadt mit knapp zwei Millionen Einwohner südöstlich des Tian Shan Gebirges. Es gibt zwei verschieden Sprachgruppen mit unterschiedlichen Zeichen ( kyrillisch lassen wir mal außen vor). Es findet sich ein Shoppingcenter (Mischung aus Basar und Kaufhaus). Darin eine gut ausgestattete Werkstatt für Computer. Die Jungs dort können mit beiden Zeichenarten umgehen. Wobei ich nicht weis ob die arabisch wirkenden Glyphen noch mal unterteilt werden müssen.

Da es mit dem Englisch nicht so gut lief, durfte ich mitspielen. Die Sache ist ganz einfach. Tastaturlayout = zwei gravierte Zeichensätze auf den Keys + Silikonschablone + virtuelle Tastatur. Entscheidung entsprechend Kommunikationspartner. Ende vom Lied war ein neues Notebook = ¨ANY KEY¨ latin mit Betriebssystem aus dunkler Schublade. Da ich nun zum Thai verdammt bin und mir gerade das entsprechende Alphabet auf virtuelle Karteikarten stanze, weis ich, es wird ein langer Weg. Doch es kommt der Tag, da finde ich ¨ANY KEY¨.

Zurück zum Thema. Mit Deinem Beispiel war ich etwas überfordert. Im Zusammenhang mit Deiner Erklärung freue ich mich über diese Variante. Variablen scheinen doch immer wieder für eine Überraschung gut. Ich fasse Deinen Tip mal als ABC-Schütze zusammen.
(Sorry, habe gerade kein Windows oben, Code also ungetestet)
set  "str=Original"  
setlocal
set  "str=contain"  
echo String beinhaltet  "%str%"  
setlocal
set  "str=Hallo Welt!"  
echo Begruessung  "%str%"  
endlocal
echo alter String hat  "%str%"  
endlocal
echo Ich bin das  "%str%"  
edit 28.12.2012 Ausführungszeichen
Die Schrittanweisung schaue ich mir in einer ruhigen Stunde an. Mir ist noch nicht ganz klar, warum ¨ELSE¨ zuerst ausgeführt wird. Makros habe ich mir jetzt als Definition angeschaut. Ist einen gesonderten Punkt wert, oder einen eigenen Beitrag. Ich würde gerne einen Schritt zurück springen und Variablen mit Umlauten betrachten.

Gibt es einen Weg, Domain- Usernamen mit Umlauten in einem normalem Textfile zu speichern, ohne das gesamte System zu manipulieren? Die Variante über XML erscheint mir etwas aufwendig.
Beispiel:
Eine Protokolldatei soll einen String erhalten, der neben verschiedenen Daten auch den betreffenden User und seine Domain-Zugehörigkeit beinhaltet. Also einen Token mit ¨Domain/User¨. Oder anders gefragt. Kann man beim Anlegen der Protokolldatei festlegen mit welchem Zeichensatz die Datei gespeichert werden soll? ¨ïcacls¨ und ¨whoami¨ besitzen keine entsprechenden Option.

Das wars für heute.
Grüße
Viefinder

Ps.: Eine virtuelle Tastatur kann etwas sein, das ein durchschnittlicher Mitteleuropäer nicht versteht.
rubberman
rubberman 27.12.2012 aktualisiert um 15:08:32 Uhr
Goto Top
Hallo Viewfinder.

Ich war für ein paar Wochen in unserem Werk in China. Wenn ich mich recht erinnere hatten die die normale englische QWERTY Tastatur. Ich habe aber nie die Zeit dazu gefunden mich damit zu beschäftigen wie die Leute dort damit chinesisch geschrieben haben.
Wie auch immer.

Dein Beispiel mit den verschachtelten setlocal und endlocal Anweisungen funktioniert genauso wie du dir das vorstellst (abgesehen von den Anführungszeichen, die man zuerst zu " machen müsste). Sei noch erwähnt, dass eine neue Subumgebung immer zunächst die Werte der Variablen erbt. Wenn du den neuen Wert über das endlocal retten willst, dann mit einer set Anweisung in der gleichen Zeile oder Block.
endlocal &set "str=%str%"

Mir ist noch nicht ganz klar, warum ¨ELSE¨ zuerst ausgeführt wird.
Wie schon gesagt wird %%i zuerst der Wert 1 zugewiesen. Erst im 2. Durchlauf bekommt %%i den Wert 2. In der IF Anweisung wird aber danach gefragt ob %%i den Wert 2 hat. Beim ersten Schleifendurchlauf noch nicht, darum wird zunächst der gesamte Klammerausdruck übersprungen und ELSE ausgeführt.

Gibt es einen Weg, Domain- Usernamen mit Umlauten in einem normalem Textfile zu speichern, ohne das gesamte System zu manipulieren?
Das System musst du dabei sicher nicht manipulieren. Du musst nur vermutlich zwischen Codepages wechseln. In dem Zusammenhang wird gerne von ASCII gesprochen, wenn es um die Kommandozeile geht und von ANSI beim Betriebssystem. So ganz richtig ist das zwar nicht, aber ich werde mal genauso argumentieren - der Einfachheit wegen.
Wenn du hierzulande ein CHCP in den Commandprompt schreibst, springt dir vermutlich ein 850 (westeuropäisch) oder 437 (englisch) entgegen. Das ANSI Gegenstück dazu wäre Windows-1252. Das heißt mit CHCP 1252 könntest du zunächst zu ANSI wechseln und deine Strings mit Umlaut in eine Datei schreiben. Dann wieder zurück zu ASCII, um die Befehlsmeldungen nicht verfälscht angezeigt zu bekommen. Beim lesen umlautbehafteter Daten aus der Datei (oder der Registry) müsstest du genauso vorgehen.
Letztlich lohnt es sich aber auch zu prüfen, ob du diesen Aufwand überhaupt betreiben musst. Wenn die Kommando zeile ein ä in eine Datei schreibt, ist es als Zeichen 0x84 dort zu finden (falls es eine Batchdatei war, in die du das ä in einem ANSI Editor geschrieben hast, ist es 0xE4). Jedes Programm liest dort nichts anderes als 0x84 (0xE4). Die Frage ist nur, wie es dann interpretiert und angezeigt wird ...

Grüße
rubberman
Friemler
Friemler 27.12.2012 aktualisiert um 22:15:31 Uhr
Goto Top
Hallo Viewfinder,

btr. Einlesen einer Datei mit Usernamen, die z.B. in Codepage 1252 gespeichert wurde, und Verarbeitung der enthaltenen Usernamen in einem Batchscript:

Die Usernamen (die Datei Test.txt aus dem unten stehenden Script):
Name1=Hans Schäfer
Name2=Michaela Schöller
Name3=Franz Müller
Name4=Heidi Maßmann
Name5=Hubert Ältlich
Name6=Klaus Öhlig
Name7=Resi Übermeier

Das Script zum Konvertieren beim Einlesen:
@echo off & setlocal

set "InFile=Test.txt"  


::Aktuelle Codepage speichern
for /f "tokens=2 delims=:." %%p in ('chcp') do (  
  set /a "OldCodePage=%%p"  
)

::Codepage einstellen, in der die einzulesende Datei gespeichert wurde
chcp 1252 > NUL

::Datei zeilenweise einlesen und Variablen setzen
::Außerdem das Unterprogramm CollectVariables aufrufen
for /f "usebackq tokens=1* delims==" %%a in ("%InFile%") do (  
  set "%%a=%%b"  
  call :CollectVariables "%%a"  
)

::Zurücksetzen auf Originalcodepage
chcp %OldCodePage% > NUL

::Alle eingelesenen Variablen verarbeiten
::und ihren Namen und Wert ausgeben
for %%v in (%Variables%) do (
  call echo %%~v=%%%%~v%%
)

::Scriptende
exit /b 0



::Es wird ein String zusammengesetzt, der die Namen aller Variablen
::aus der im Hauptprogramm eingelesenen Datei enthält, durch Freizeichen
::getrennt und jeder Variablenname in Anführungszeichen eingeschlossen
:CollectVariables
  set "Variables=%Variables% "%~1""  
exit /b 0

Gruß
Friemler
Viewfinder
Viewfinder 28.12.2012 um 03:48:55 Uhr
Goto Top
Guten Morgen rubberman

¨Any Key¨ Die chinesischen Zeichen werden über eine Art virtuelle Tastatur mit integriertem Translater gesetzt. Bei den Jungs war das was ganz kleines am unterem Bildschirmrand. Da für die Chinese, Japaner und vermutlich auch Koreaner der Umgang mit latin-Letter normal ist, wird mit diesen gearbeitet. Das Ding was ich gesehen habe, hatte eine Eingabezeile die nach ¨Enter¨ ¨China-Satz in Bild-Glyphen¨ zurück gibt. Das wurde dann kopiert. Irre aufwendig. Für uns würde die umgekehrte Variante Sinn machen. Ob das funktioniert ? face-wink

" ¨¨ " an diesen Zeichen erkennst Du das ich nicht unter Windows arbeite. Als Amateur muss ich hier kopieren. Mein Keyboard kennt nur ein Anführungszeichen, welches fataler Weise keines ist. Sorry. Habe oben den Code korrigiert.

¨Umlaute - Sonderzeichen¨ Das Problem stellt sich erst, wenn ich Variablen speichern muss. Speziell Variablen die Daten wie Domäne oder Username beinhalten. In Thai habe ich es noch nicht getestet, vermute aber die gleichen Probleme. In der Variable wird der originale Zeichensatz (ausgelesen oder vom System geliefert) ohne Probleme gespeichert. Erst wenn ich diese Variable in eine Datei schreiben muss, kommt es zum Problem. Die angelegte Datei enthält nicht die gewünschten Zeichen. @Friemler hat noch etwas geschrieben. Ich schaue mir das heute als Gute Nachtgeschichte in Windows an. Eventuell, kann ich das Problem dann etwas kompetenter beschreiben oder es ist gelöst. das Thema scheint recht heftig zu sein und es gibt schon einiges wie
- Bat Script Probleme bei Sonderzeichen
- Sonderzeichen auf csv Datei auslesen und in neuer Datei abspeichern
- Umlaute und Sonderzeichen in Batchdateien

¨For /L¨ Die Hilfe liefert ein verständliches Beispiel für Zahlenwerte. Im Zusammenhang mit Deinem Makro stehe ich noch etwas auf der Leitung. Die Aufteilung der Werte bereitet mir noch Probleme. Was ich zur Unterteilung finde, ist die Klammer. Kann ich es folgendermaßen verstehen?
Wert 1 = (Wert in Klammer)
Wert 2 = Wert nach der Klammer

Grüße
Viewfinder
Viewfinder
Viewfinder 28.12.2012 um 04:11:52 Uhr
Goto Top
Hallo Friemler,
danke für das Skript. Es geht also auch ohne SQL. Verzeih mir bitte, wenn ich mir das Beispiel erst als Nachtlektüre zuführe. Ubuntu hat noch keine Windowshilfe, surfen geht aber face-wink. Wie auch @rubberman erwähnt, dreht sich alles um Codepage 1252. Eventuell lässt sich das Skript auch zum Speichern drehen. Wie erwähnt, Windows erst wenn Sonne aus. Dann kann ich auch nachschauen, was für ein ¨EXIT¨ bei Dir werkelt.
Habe gerade mal bei Wikipedia nach 1252 geschaut. Das geht nicht in ein paar Minuten. Eine etwas qualifiziertere Antwort gibt es morgen.

have a nice day
Viewfinder
rubberman
rubberman 28.12.2012 aktualisiert um 22:50:09 Uhr
Goto Top
Hallo Viewfinder.

Im Zusammenhang mit Deinem Makro stehe ich noch etwas auf der Leitung.

Heb mal den Fuß an face-wink
Ich versuche es noch mal anders darzustellen. ELSE wird zuerst abgearbeitet weil %%i im ersten Anlauf NICHT 2 ist und die IF Anweisung deshalb in den ELSE Zweig springt.
@echo off &setlocal
for /l %%i in (1 1 2) do (
  echo ***  i ist %%i !
  echo Ist i gleich 2 ?
  if %%i==2 (
    echo Ja, i ist 2.
  ) else (
    echo Nein, i ist nicht 2.
  )
  echo ~~~~~~~~~~~~~~~~~~~~
)
pause
Wenn's jetzt nicht klick macht, fällt mir nix mehr ein face-big-smile

Grüße
rubberman
EDIT:
Um noch mal auf die Codepages zurück zu kommen ... Da du ja offenbar mit fernöstlichen Versionen arbeitest, ist die 1252 evtl. überhaupt nicht interessant für dich. Du kannst die verwendeten Codepages für dein System auch aus der Registry lesen:
@echo off &setlocal

for /f "tokens=3" %%i in (  
  'reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "OEMCP"'  
) do set /a oemcp=%%i
for /f "tokens=3" %%i in (  
  'reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "ACP"'  
) do set /a acp=%%i

echo %oemcp%
echo %acp%
pause
Der Code spuckt auf meiner Kiste
850
1252
aus. Teste mal, was bei der Thai Version heraus kommt.
Viewfinder
Viewfinder 28.12.2012 um 23:51:05 Uhr
Goto Top
Morgen rubberman,
Wenn's jetzt nicht klick macht, fällt mir nix mehr ein
5 Uhr und zu heiß zum schlafen. Ich kann nur feststellen, Du bist schlimmer als Microsoft. Allerdings findet sich bei Dir am Ende eine Auflösung. face-wink
Um noch mal auf die Codepages zurück zu kommen ... Da du ja offenbar mit fernöstlichen Versionen ...
Ich sehe ein relevantes System in einigen Jahren basierend auf deutsch, englisch und thai. Oder einen kompletten Verzicht auf Microsoft, was im Moment noch nicht wirklich möglich ist (proprietäre Software). Damit sind wir auch schon beim aktuellen Thema. Was die beiden Nootbooks namentlich "Leiche" und "Sarg" liefern, ist Tatsache interessant. Die beiden stehen unter Quarantäne. Das empfielt sich für jeden Computer der in Vietnam ungeschützt am Internet war. Zu den beiden ausgehauchten Invaliden schreibe ich etwas, wenn die Dinger heute Abend laufen.
So nun kann ich etwas rumspielen und das Codpageproblem hoffentlich besser einkreisen. Ich werde jetzt mal den deutschen Übereifer mit Thai bombadieren. Bin schon gespannt, wie sich das im Bezug auf Benutzernamen auswirkt.

Thanks for the Script
Viewfinder
Viewfinder
Viewfinder 29.12.2012 aktualisiert um 11:02:30 Uhr
Goto Top
Hallo rubberman,
der Sarg meiner Partnerin liefert OEMCP = 874 und ACP = 874. Das XP SP3 läuft jedoch auf englisch. Mit der Antwort von @ Friemler kommt mir eine Idee. Geht Ihr beiden zusammen Tennis spielen? Ich setze mal unten etwas auf, das mal wieder nicht funktioniert.

Grüße
Viewfinder

Ps.: OEMCP und ACP wird oft bei Google geliefert, doch eine richtige Erklärung habe ich nicht gefunden. Wenn ich die Kodierung des Skriptes ändere, geht ACP auf meinem Rechner von 1252 zu 850. Ich benutze Notpad++.
Viewfinder
Viewfinder 29.12.2012 um 11:17:06 Uhr
Goto Top
Hallo Friemler,
sorry wenn ich etwas hinter her hinke. Ich verarbeite noch etwas langsam. Die Idee mit dem "Exit-Point" ist Klasse. Offensichtlich ist die Hilfe etwas missverständlich, da es dort heißt, das das Programm geschlossen wird. Oder ich missverstehe die Begriffe "Routine" und "Program". Letztendlich ist es eine praktische Idee, wenn das Ende einer Routine einen eigenen Index liefern kann.
Mit der gesammelten Verarbeitung der Variablen hänge ich noch. Bei Zeile 27 "call echo %%~v=%%%%~v%%" stehe ich im Regen.
Das Thema Codepages ist vom Prinzip recht einfach. Leider in der Praxis jedoch nicht. Es kann sein das wir zu sehr ziellos durch die Gegend schwimmen und ein handfestes Beispiel brauchen. Ich versuche weiter unten mal einen Ansatz.

Grüße
Viewfinder
Viewfinder
Viewfinder 29.12.2012 um 11:52:39 Uhr
Goto Top
Ich greife hier noch einmal das Thema Codepage gesondert auf. Im Speziellem liegt mir das auslesen von Domain- und Usernamen sehr nah. Die Problematik ist selbstverständlich um einiges komplexer. Ich versuche mal ein kleines Beispiel zu inzenieren.
Nehmen wir eine Domain-Controler. Die Userverzeichnisse und die Profile sollen über diesen Domaincontroler aktuell gehalten werden. Die angeschlossenen Systeme arbeiten in englisch, deutsch und thai. Englisch - Deutsch läßt sich mit Windows 1252 zusammenfassen. Thai wird unter Windows mit 874 abgedeckelt. Dieses soll kompatibel mit TIS-620 sein. TIS-620 finde ich in meinem Editor wieder. 874 in keinem meiner Editoren. CMD versteht kein UTF-8.
Gibt es auf Basis von CMD überhaupt eine handelbare Lösung, um per Skript zuverläßig mit Domain- und Usernamen zu arbeiten?
@Friemler und @rubberman liefern zwei Ansätze.
1. Auslesen der aktuellen Codepage aus der Registry.
2. Setzen einer Codpage per Skript.
Schön, wenn das schon die Lösung wäre. Das folgende Beispiel zeigt, das da noch eine Menge fehlt.
temp_file1252.txt gespeichert in "Windows 1252"
Umlaute ae=ä oe=ö ue=ü sz=ß
temp_file850.txt gespeichert in "850"
Umlaute ae=„ oe=” ue= sz=á
temp_file874.txt gespeichert in "TIS-620"
Kein Problem = โนพรอบเลม
Das Anlegen der Dateien im jeweiligen Format ist mir unter CMD nicht geglückt. Der folgende Code ist die erfolglose Erweiterung der bisherigen Vorschläge, zum Auslesen der Textdateien.
@echo off &setlocal
pushd %~dp0
set "tmp_file=%~dp0%~n0"  
echo Check codepage in registry
echo --------------------------
for /f "tokens=3" %%i in (  
  'reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "OEMCP"'  
) do set /a oemcp=%%i
for /f "tokens=3" %%i in (  
  'reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "ACP"'  
) do set /a acp=%%i
echo %oemcp%
echo %acp%
for /f "tokens=2 delims=:." %%p in ('chcp') do (  
  set /a "OldCodePage=%%p"  
)
::Aktuelle Codepage speichern
for /f "tokens=2 delims=:." %%p in ('chcp') do (  
  set /a "OldCodePage=%%p"  
)

echo Mal ein wenig spielen
echo ----------------------
echo Thai
chcp 874 >NUL
call :SHOW_CHARACTER_SET
type "%tmp_file%874.txt"  
echo.
echo deutsch
chcp 850 >NUL
call :SHOW_CHARACTER_SET
type "%tmp_file%850.txt"  
echo.
echo deutsch Windows
chcp 1252 >NUL
call :SHOW_CHARACTER_SET
type "%tmp_file%1252.txt"  
echo.


:EXIT
:: Codepage wiederherstellen
chcp %OldCodePage% > NUL
call :SHOW_CHARACTER_SET
popd
endlocal
goto :eof

:SHOW_CHARACTER_SET
for /f "tokens=2 delims=:." %%I in ('chcp') do set "codepage=%%I"  
echo aktueller Zeichensatz "%codepage%"  
goto :eof

:: CODEPAGES_INDEX
850;MS-DOS-Latin-1
874;Thai-Windows based on TIS-620
1252;Windows-1252 Western European
Hoffentlich ist es jetzt nicht zu allgemein gehalten.

Grüße
Viewfinder
rubberman
rubberman 29.12.2012 aktualisiert um 23:35:17 Uhr
Goto Top
Hallo Viewfinder,

nur um das richtig zu verstehen: Du hast einen Domaincontroller. Soweit OK, Windows arbeitet intern mit Unicode - es ist uninteressant wie die Domain- oder Usernamen aussehen, Windows wird damit umgehen können.
Welche Rolle spielt Batch dabei? und dann noch über unterschiedliche Sprach- und Zeichensatzbarrieren hinweg?
Batch arbeitet im Grunde mit Zeichen, die 1 Byte Breite haben. Das heißt du müsstest einen Zeichesatz finden, der alle Unicodezeichen in mit nur einem Byte Breite darstellen kann, damit sowohl deutsche Umlaute, als auch Thaibuchstaben abgedeckt werden. Es ist klar, dass das nicht funktioniert.
Natürlich kannst du versuchen mit dem bisschen Unicodesupport zu arbeiten, dass dir Batch bietet. Ich fürchte aber dass du darüber verzweifeln wirst.

Ich spiele hier auf einem deutschen Win7 x86. Nun starte ich mal den Versuch, damit per Batch sprachunabhängig zu arbeiten:

1. Ich erstelle ein neues Profil auf meiner Kiste. Da ich von Thai keine Ahnung habe, aber kyrillisch wenigstens lesen kann, heißt der neue Benutzer испытание.

2. Ich melde mich als испытание an und öffne ein CMD Fenster.
Das erste was mir entgegen spring, ist der Prompt
C:\Users\?????????>
Ich habe nichts anderes erwartet, da die Rasterschriftart kein Unicode unterstützt.
Ein SET USER eingegeben, führt zu einer ebensolchen aussagekräftigen Ausgabe:
C:\Users\?????????>set user
USERDOMAIN=steffen-PC
USERNAME=?????????
USERPROFILE=C:\Users\?????????

3. Also Rechtsclick auf den oberen Fensterrand > Eigenschaften und Schriftart nach Lucida Console umgestellt und das Fenster neu geöffnet. Siehe da, es sieht schon mal besser aus.
C:\Users\испытание>set user
USERDOMAIN=steffen-PC
USERNAME=испытание
USERPROFILE=C:\Users\испытание

4. Nun könnte man beinahe davon ausgehen, dass die Umleitung des Benutzernamens in eine Datei funktionieren sollte. Pustekuchen, in der Datei findet sich ein
?????????

5. Wir nutzen die Unicodeoption der CMD um den Benutzernamen umzuleiten
cmd /u /c >"test.txt" echo %username%
Je nach Editor, mit dem du die Textdatei öffnest, wirst du ggf. etwas in der Art sehen:
8A?KB0=85
Warum? Der Editor versucht 1 Byte breite Zeichen zu lesen, da das Byte Order Mark für Unicode am Anfang der Datei fehlt.

6. Und damit will ich es auch beenden ...
Wir bauen einen Batch, der zuerst das BOM (ohne Zeilenumbruch) in die Datei schreibt und anschließend den Benutzernamen hinterher.
@echo off &setlocal
set "filename=utf16.txt"  

:: zu ANSI wechseln
chcp 1252>nul

:: Byte Order Mark erstellen (UTF-16 little endian)
>"%filename%" set /p "=ÿþ"<nul  

:: Username im Unicode Modus schreiben
cmd /u /c >>"%filename%" echo %username%  
Nun findet sich ein
испытание
in utf16.txt.

Stellt sich die Frage, ob du mit solchen alptraumhaften Workarounds tatsächlich arbeiten willst?

Grüße
rubberman
Friemler
Friemler 29.12.2012 aktualisiert um 21:56:41 Uhr
Goto Top
Hallo Viewfinder,

wenn man ein Batchscript testet/untersucht, ist es immer eine gute Idee, das meist einleitende @echo off zu entfernen, dann wird jeder Befehl vor seiner Ausführung nochmal angezeigt. Die oben von Dir erwähnte Zeile 27
call echo %%~v=%%%%~v%%
expandiert dann z.B. zu
call echo Name1=%Name1%
Aber OK, wie kommt es dazu?

In der Laufvariablen der FOR-Schleife %%v ist der Name der aktuellen Variablen gespeichert, allerdings von Anführungszeichen umgeben. Die werden durch die Tilde in %%~v entfernt.

Links vom Gleichheitszeichen soll direkt der Variablenname auftauchen, deshalb kann ich dort %%~v schreiben.

Rechts vom Gleichheitszeichen soll der Name der Variablen eingesetzt und dann ihr Wert ermittelt und ausgegeben werden. Das sind zwei Schritte. Ich muss den Batchinterpreter also dazu zwingen, die Codezeile zweimal zu parsen.

Das passiert durch das CALL am Anfang der Zeile. Damit beim zweiten parsing der Name der aktuellen Variablen in %%v auch als auszuwertende Variable erkannt wird, muss er, so wie in Batchscript üblich, in Prozentzeichen eingeschlossen werden. Wenn man dazu nur ein Prozentzeichen hinschreibt, also
%%%~v%
werden die beiden äußeren Prozentzeichen vom Parser ebenfalls beseitigt und es gibt wieder einen Fehler. Wenn man diese beiden Prozentzeichen verdoppelt, macht der Parser ein Prozentzeichen daraus. Man schreibt also
%%%%~v%%
Et voila - es funktioniert.

Gruß
Friemler
Friemler
Friemler 29.12.2012 aktualisiert um 21:59:24 Uhr
Goto Top
Hallo Viewfinder,

noch ein wenig Grundlagenforschung.

Ich habe hier mal ein Bild einer Konsolensitzung incl. Kommentaren beigelegt. Ein Bild deshalb, damit ich wirklich ein originalgetreues Abbild der Bildschirmausgabe präsentieren kann, ohne dass es bei der Darstellung im Browser durch die Codierung der Webseite zu Verfälschungen kommt.

a8c2a83f7da12cc43c9413347a8907f2

Wie man sieht, findet die Ausgabe auf der Konsole immer in der Codepage 850 statt (deutsches Windows). Der Befehl CHCP bewirkt nur ein Umschalten der Codepage für die Eingabe über die Tastatur und die Ausgabe in Dateien.

Man kann auch erkennen, dass es möglich ist, von der Konsole aus Dateien in der CP1252 zu schreiben und beim Einlesen wieder in CP850 zu konvertieren, wenn man den Umweg geht, den Dateiinhalt zuerst einer Variablen zuzuweisen.


Interessant ist das, was an der Stelle passiert, wo der Kommentar orange eingerahmt ist. Aktive Codepage ist hier 1252. Die Variable ALine wurde vorher, als die aktive Codepage 850 war, mit dem Inhalt aus der Datei beschrieben, enthält also Zeichen, die in der CP850 die gleichen Codes wie die Zeichen "äöüßÄÖÜ" aus der CP1252 haben.

Beispiel: Das erste Zeichen in der CP1252-Datei ist ein ä, das entspricht Code 0xE4 in der CP1252. In der CP850 entspricht 0xE4 einem kleinen O mit Tilde darüber, eben dem Zeichen, das im Bild zu sehen ist.

Nachem auf CP1252 umgeschaltet wurde, wird der Variableninhalt konvertiert. CMD sucht dazu in der CP1252 nach einem kleinen O mit Tilde darüber. Dieses Zeichen hat dort den Code 0xF5. In der CP850, die ja für die Ausgabe immer verwendet wird, entspricht 0xF5 einem Paragraphzeichen, was dann bei der gekennzeichneten Stelle auch ausgegeben wird.


Problematisch wird es, wenn man in den Code eines Batchscripts konstanten Text schreibt, den man in eine CP1252-Datei schreiben will. Da der Quellcode des Batchscripts als CP850-codiert interpretiert wird, ist das mit dem konstanten Text auch so. Selbst wenn man vor dem Schreiben auf CP1252 umschaltet, ist das, was nachher in der Datei steht, mit einem CP1252-Editor u.U. nicht lesbar. Umgehen lässt sich das, indem man

  • die Sonderzeichen mit einem CP1252-Editor in den Quellcode des Batchscripts einträgt,
  • die Verfahren aus Deinem oben schon geposteten Beitrag verwendet,
  • den konstanten Text einer Variablen zuweist, deren Inhalt beim Umschalten auf CP1252 ja konvertiert wird.


Ich hoffe, ich konnte Dir damit etwas weiterhelfen, wenn nicht nochmal langsam lesen und selbst experimentieren. face-wink
Bzgl. Domain- und Usernamen in Batchscript innerhalb einer polylingualen IT-Umgebung hat rubberman ja schon alles geschrieben.


Gruß
Friemler
rubberman
rubberman 29.12.2012 aktualisiert um 23:34:35 Uhr
Goto Top
Hallo Friemler,

sehr schön beschrieben face-smile

Ich weiß bloß nicht ob dieses Spielen mit der Codepage für Viewfinder wirklich hilfreich ist. Was meinst du?

Worauf ich hinaus will ist folgendes:
Der deutsche/englische Client schreibt ein Ä mit Codepage 1252 in eine Textdatei. Der Thai Client schreibt ein ฤ mit Codepage 874 in eine Textdatei. Beide Dateien enthalten nun das Byte 0xC4, das (je nachdem welcher der beiden Zeichensätze zum Interpretieren herangezogen wird) entweder als Ä oder ฤ angezeigt wird.
Was macht der Domaincontroller/Server damit, wenn er so etwas vor die Füße geworfen bekommt? Oder anders gefragt, woher weiß der Server welchen Zeichensatz er für welche Datei anziehen muss?

Grüße
rubberman
Friemler
Friemler 29.12.2012 um 22:18:20 Uhr
Goto Top
Hallo rubberman,

na ja, wie ich das Posting schon überschrieben habe: Es ist Grundlagenforschung face-wink und dient mehr dem grundsätzlichen Verständnis.

Das Re­sü­mee, das man aus Deinem und meinem Posting ziehen kann, ist:

  • Das ist mit Batchscript alles nicht so einfach.
  • Man bekommt eine ungefähre Ahnung, wo die Schwierigkeiten liegen und kann eher abschätzen, ob bestimmte Dinge mit Batch machbar sind oder nicht.
  • Man sieht eher den Sinn darin, VBScript oder Powershell zu lernen.

Gruß
Friemler
rubberman
rubberman 29.12.2012 um 23:48:40 Uhr
Goto Top
Hallo Friemler,

ich bin bei dir, dass Batch hier eher suboptimal ist.
Was VBScript angeht, bin ich aber geteilter Meinung. Da ist der Unicodesupport ähnlich bescheiden.
Bei Powershell habe ich leider zu wenig Erfahrung. Das Potenzial ist sicher vorhanden (allein durch das Zusammenspiel mit .NET). Das Interface ist aber auch wieder die Console, was zumindest wieder einschränkend wirkt.

Ich warte mal auf weiteren Input von Viewfinder. Mir ist immer noch nicht klar, welchem Zweck die Umleitung von Domain- oder Benutzername in eine Datei eigentlich dient.

Grüße
rubberman
Viewfinder
Viewfinder 30.12.2012 um 05:20:17 Uhr
Goto Top
Hallo rubberman, hallo Friemler,
Thanks for the generous breakfast. Das von mir gegebene Beispiel habe ich benutzt, damit wir über etwas konkretes reden können. Es bezieht sich auf eine Konstelattion aus der Vergangenheit. Ein Einman-Büro mit vier Arbeitsplätzen verwaltet über einen NT4-Server. Die Arpeitsplätze waren nicht personengebunden. Etwas ähnliches schwebt mir hier in ungefähr zwei Jahren vor. Das Arbeitsgebiet hat sich mittlerweile geändert und ich muss oder besser will meine momentane eher unproduktive Zeit zum lernen von Programiersprachen nutzen. Einstieg CMD
- liegt auf alle Windowsversionen mit prüfbaren Einschränkungen vor
- ist simpel (theoretisch)
Da ich ein Ziel brauche (bin schon beim Gedicht auswendig lernen wenig begeistert), habe ich das gegriffen, was mir wichtig scheint. Batchfile als Werkzeug zur Benutzer und Rechteverwaltung. An den entscheidenen Stelle habe ich bereits rumgebastelt und nun waere der nächste Schritt multilingual und ein Konzept. Leider ist unter CMD der Support von SID nicht vollständig handelbar. Es bleibt nur der Weg über eindeutige Benutzernamen. Und schon sind wir da, wo wir jetzt sind. CMD handelt keinen UniCode.
Der gestriege Verdacht bestätigt sich. Mit Eurer Kompetenz läßt sich was meißeln. Die von Euch gezeigte Beispiele bieten einen Weg für jeweils spezielle Fälle. Doch es wird auch eines klar. Alle Windows ist nicht der kleinste gemeinsame Nenner, wenn man CMD benutzt. Alleine das Integrieren von Datenbeständen deren Dateinamen andere Copages verlangen, wird auf CMD eine endlose Baustelle.
Zitat Friemler
Man sieht eher den Sinn darin, VBScript oder Powershell zu lernen.
Powershell kam mir erst mit Win7 zu Ohren. Also vor ungefähr drei, vier Monaten. Wie weit sich das auf XP einsetzen läßt weis ich nicht. XP verschwindet aber auch hier allmählich von der Bildfläche.
Zitat rubberman
... Mir ist immer noch nicht klar, welchem Zweck die Umleitung von Domain- oder Benutzername in eine Datei eigentlich dient.
- beispielsweise der Protokollierung wer, wann, was mit dem geplantem Tool an der ACL rumgefummelt hat
Ein geplantes Zenario war folgendes:
- ermittle wer Du bist (aktueller User - whoami)
- schaue welche Rechte du auf xyz hast (icacls)
- sichere ACL auf dem nächst höheren Knoten (icacls)
- uebernehme beispielsweise Schreibrechte am Knoten oder an entsprechender Stelle unterhalb des Knotens (icacls)
- formatiere in allen Dateien den Zeilenumbruch von LF zu CRLF (oder umgekehrt z.B. mit tofrodos)
- stelle ACL wieder her (icacls)
Anwendungsbeispiel:
Ich weis nicht wie weit Ihr mit Webprojekten konfrontiert seid. Das Thema Zeilenumbruch wird definitiv auch im professionellem Sektor unterschätzt. Bei mir handelt es sich um ein komplexes CMS-System auf PHP-Basis. Der Sprache die ich auf jeden Fall lernen muss, wenn ich endlich wieder eine vernünftige Internetanbindung habe. Besagtes CMS-System bereitet vielen Schwierigkeiten unter Windows. Da wird an allen Ecken rumgeschraubt (mich eingeschlossen). Selbst bei Fehlermeldungen von Dateien und Verzeichnissen, die es gar nicht gibt, tappt man frohen Mutes in die falsche Richtung. Oft funktionieren Up- Down- loads nicht mit der gewünschten Formatierung oder die Projekte sind lokal gespeichert.
Es gibt Dateien die expliziet schreibgeschützt bleiben sollen, jedoch umformatiert werden müssen. Wenn es sich jetzt um einen entfernten Rechner handelt auf dem Windows läuft, wäre CMD im Vorteil. Die Verwaltung der Rechte und Benutzer wollte ich aufgrund der thematischen Verwandschaft gleich mit erschlagen.
Erkenntnis:
Die Schritte mit CMD sind immer sehr klein.

Grüße
Viewfinder
rubberman
rubberman 30.12.2012 um 15:47:17 Uhr
Goto Top
Hallo Viewfinder,

bei dem Gedanke, dass du die Domaincontrollersoftware mehr oder weniger mit Batch schreiben willst, sträuben sich mir die Nackenhaare.
Nein, ich selbst habe mit der Verwaltung von Netzwerken oder Webprojekten nichts zu tun. Da bin ich auf die Arbeit unserer Admins angewiesen. Kann dir nur raten, dich noch mal bei unseren Netzwerkern schlau zu machen. Die sind eher weniger in dieser Ecke des Forums zu finden (und haben wahrscheinlich ihre Gründe).

Worauf ich hinaus will:
1. Es muss eine bessere Lösung als Batch geben. Du wirst einen vernünftigen Unicodesupport benötigen, und zwar generell und nicht nur partiell.
2. Das Konzept liegt aber in deiner Hand. Wir können dir hier nur Tips bei Einzelproblemchen geben. Ob das für das große Ganze dann sinnvoll ist, kann zumindest ich nicht beurteilen, weil keine Erfahrung auf diesem Gebiet.

OK, ich picke mal ein paar Stichworte heraus.

Leider ist unter CMD der Support von SID nicht vollständig handelbar.
Was benötigst du?
@echo off &setlocal
for /f "tokens=2" %%i in ('whoami /user /fo list') do set "sid=%%i"  
echo %sid%
pause
Da wäre dann auch noch die WMI, über die das auch remote funktionieren würde (per Batch pur mit WMIC, ist meines Wissens ab XP Pro dabei).


formatiere in allen Dateien den Zeilenumbruch von LF zu CRLF
wenn ich mich recht erinnere
<"InMitLf.txt" >"OutMitCrLf.txt" more


Es gibt Dateien die expliziet schreibgeschützt bleiben sollen, jedoch umformatiert werden müssen.
attrib /? sollte weiter helfen

Grüße
rubberman
Viewfinder
Viewfinder 31.12.2012 aktualisiert um 03:34:54 Uhr
Goto Top
Guten Morgen rubberman,
die Depression ist vorbei. Ich habe einen langen Tunnel gegraben und stehe mit Schippe und Eimer vor einem riesigen Stein. Der Klumpem hat auch noch eine Aufschrift. "Wenn Du mich ausgräbst, KANNST Du einen roten Mond sehen."

Schippe, Eimer:
Es hat nicht viel Sinn über die unterschiedliche Ausgabe von "USER" und "GROUP" nachzudenken. Die Ermittlung der SID zum aktuellem User ist nur eine Frage des jeweiligen Tokens.
- erste For liest die relevanten Daten aus und setzt einen angepaßten String in eine Variable
- zweite For ermittelt nun endlich die Daten (hier Domain/User-Name) und schreibt diese in eine Variable.
Diese Variable wird später als Suchstring verwendet.
for /f "delims=, tokens=1,2" %%a in ('whoami /user /fo csv /nh') do (  
	set ID_User=%%a,USER,%%b
	set ID_User=!ID_User:"=!  
	)
set "NamesList="  
for /f "delims=, tokens=1" %%c in ('echo !ID_User!^& whoami /groups /fo csv /nh') do (  
	set Names=%%c
	set Names=!Names:"=!  
	set NamesList=!NamesList!#!Names!#;
	)
Das kann man auch alles mit einer SID machen. Ein Abgleich sollte doch mit icacls machbar sein. So und jetzt kommts.
Stein:
"icacls" bietet ne Menge Optionen zum Steine schmeissen, aber nur zwei um mal eben das Fenster vorher zu öffnen.
- Option 1 betrachten des gewünschten Objektes (nicht dokumentiert)
icacls Objektname
Nicht gleich drauf losbasteln. Erstmal die Ausgabe in eine Datei absetzen und dann die Darstellung nicht druckbarer Zeichen und die Formatierung genießen. Das ist fürs Auge gemacht. Vom Schaltern /Q ganz zu schweigen.
Die Ausgabe erfolgt nur im Zusammenhang mit USERNAME.
- Option 2
icacls Objektname /findsid username
icacls Objektname /findsid *SID
Die Ausgabe sagt nichts zu den Rechten. Aus meiner Sicht also schlichtweg unbrauchbar.

Egal wie wir die Sache jetzt drehen. Es bleibt nur der Weg über USERNAME und der benötigt UniCode oder eine Endlosbaustelle. Wenn wir uns auf Western und Thai beschränken mag es noch einen Weg geben, doch sobald beispielsweise eine kyrillisch betitelte Datei auftaucht ist alles im Eimer. Eine Erkenntnis, die ich mit Euren Beschreibungen von vorgestern als Fakt hinnehmen mus.

In Folge eine abgespeckte Version wie die Schreibrechte im und am jeweiligen Projektverzeichnis geprüft werden sollten.
Diesen Code gibt es hier "Anwendungsbeispiel - Is von mir." schon in ähnlicher Form. Es werden nur die Probleme angezeigt. Mit einer Ausnahme "Codepage" face-wink.
Ich denke das Beispiel umschreibt mit Objektname und Username das Problem recht treffend. Selbst wenn es einen Weg zum handeln der SID gibt, stehen immer noch die Namen von Links, Verzeichnissen und Dateien als Risiko im Weg.
CMD ist eine Insel.
:Environment
@echo off
setlocal
pushd %~dp0
setlocal enabledelayedexpansion
	set "file_path=F:\Public\Projects\WWW\testbasis\Test"  

:Routine
call :ListUserNames
call :PermWrite

:EXIT
setlocal disabledelayedexpansion
popd
endlocal
goto :eof

:ListUserNames
for /f "delims=, tokens=1,2" %%a in ('whoami /user /fo csv /nh') do (  
	set ID_User=%%a,USER,%%b
	set ID_User=!ID_User:"=!  
	)
set "NamesList="  
for /f "delims=, tokens=1" %%c in ('echo !ID_User!^& whoami /groups /fo csv /nh') do (  
	set Names=%%c
	set Names=!Names:"=!  
	set NamesList=!NamesList!#!Names!#;
	)
goto :eof

:PermWrite
setlocal
For %%I in ("%file_path%\..") do (  
	set "ParentDir=%%~fI"  
	)
:: Trefferanzahl n-1
set match=
for /f "tokens=*" %%a in ('echo "%ParentDir%"^& dir %file_path% /b /s') do (  
	set Match_d=
	set Warn=
	set set Prot_b=& set Prot_c=& set Prot_d=
	set Prot_a=a
	for /f "tokens=* usebackq" %%b in (`icacls "%%a"`) do (  
		if "!Match_d!" LEQ "!match!" (  
			set B=%%b
			set B=!B:%%a =!
			set B=!B:^(=[!
			set B=!B:^)=]!
			if "%%b" EQU "%%a " set Warn=b  
			set Prot_b=b
			for /f "delims=:" %%c in ('echo !B!^|findstr /E /L "F] M] W]"') do (  
				set Prot_c=c
				for /f "tokens=*" %%d in ('echo %NamesList%^|Findstr /I /C:"#%%c#"') do (  
					set /a Match_d+=1
					::echo %%c
					set Prot_d=d
					)				
				)
			)
		)
	if "!Prot_b!" NEQ "b" (  
		echo ERRROR;Error;"icacls" Abfrage nicht moeglich mit "...\%%~nxa".  
		)
	if "!Warn!" EQU "b" (  
		echo NOTICE;Warn;Keine Rechte definiert fuer "...\%%~nxa".  
		)
	if "-!Prot_b!-!Warn!-!Prot_c!-!Prot_d!-" EQU "-b----" (  
		echo NOTICE;Warn;Kein Schreibzugriff definiert auf "...\%%~nxa".  
		)
	if "-!Prot_b!-!Warn!-!Prot_c!-!Prot_d!-" EQU "-b--c--" (  
		echo NOTICE;Tip;USER "%USERNAME%" besitzt keine Schreibrechte an "...\%%~nxa".  
		)
	)
if "!Prot_a!" EQU "" (  
	echo ERROR;Error;:PermWrite kann nicht ausgefuehrt werden.
	echo ERROR;Tip;Pruefen "icacls", "whoami" oder "%file_path%".  
	)
endlocal
goto :eof
Aehm, was ist das? Ich habe hier im Zusammenhang mit CMD auf die Schnelle nichts gefunden.
<"InMitLf.txt" >"OutMitCrLf.txt" more
Nachtrag
Jetzt schnalle ich erst was Du meinst. Funktioniert die Umleitung mit jeder textbasierenden Datei zuverlässig? z.B. ".ht-xyz", "xyz.css" oder "xyz.php"
Nachtrag Ende
Hier befürchte ich das gleiche Problem mit der Codpage bei den Namen von Objekten.
attrib /? sollte weiter helfen

So nun gehe ich mal ne Kamera fürs Schnocheln suchen. Das neue Jahr soll besser starten als es mit CMD aufhört.
Ich wünsche allen einen Guten Rutsch.

Grüße
Viewfinder
Friemler
Friemler 31.12.2012 aktualisiert um 15:09:59 Uhr
Goto Top
Hallo Viewfinder,

kann man Dir um diese Zeit aufgrund der Zeitverschiebung schon ein frohes Neues wünschen? face-wink

Aber zu Deinem Problem: Dir wird nichts anderes übrig bleiben, als das zunächst und nur scheinbar einfachere Batchscript links liegen zu lassen und Dich direkt mit Powershell zu beschäftigen. Die ist nämlich voll Unicode-fähig und manche Dinge sind außerdem direkter und einleuchtender zu lösen, bei denen man unter Batchscript eine Lösung "von hinten durch die Brust ins Auge" basteln muss.

Um ACLs abzufragen z.B.
get-acl -path xyz

Hier habe ich auf die Schnelle mal einen Technet-Artikel zum Thema gefunden.

Powershell ist auch für XP SP3 verfügbar, der Download besteht aus dem Paket Windows Management Framework. Es ist auch eine brauchbare Entwicklungsumgebung für Powershell-Script von MS verfügbar, mal nach Powershell ISE suchen.

Anfang Dezember ist gerade die neuste Version 3.0 von Powershell erschienen, aber VORSICHT! MS hat diese Version nach einigen Tagen wieder aus Windows Update entfernt, da es noch Kompatibilitätsprobleme mit einigen Serverprodukten gibt. Auf der Downloadseite sind diese Infos auch zu finden.

Alles Gute für 2013
Friemler
Viewfinder
Viewfinder 01.01.2013 aktualisiert um 03:21:19 Uhr
Goto Top
Hallo Friemler,
14:29:12 Uhr -> UTC+7 -> 20:29:12 passt. Es war schon dunkel. CMD ist für einen Startup eine Umgebung in der man schnell zu einem Ergebnis kommt, ohne umfangreiche Vorkenntnisse haben zu müssen. Ihr habt mich gut gefordert und es läßt sich eines feststellen. Durch den fehlenden UniCode-Support unter CMD muss vom Einsatz dieses Interpreters in Umgebungen die verschiedene Codepages verlangen abgeraten werden.
War jetzt alles umsonst?
Neben der Tatsache, das die Zeit für CMD mit dem Zusammenwachsen der Netzwerke abgelaufen ist, kann zumindestens ich einiges mitnehmen. Meinen einleitenden Text zu diesem Thema werde ich überdenken und morgen etwas ändern.
Ich habe mal schnell ein wenig in Deinem Link geschnüffelt und sehe da gewaltige Unterschiede zu CMD. Das betrifft allerdings auch das Theme universeller Einsatz. Da ich einen Server auf XP- Basis in halbwegs professioneller Umgebung auschliessen kann, streiche ich XP von der Liste. Es bringt mir zu viele Probleme die ich mit CMD umgehen wollte. Win7 besitzt auch hier eine weite Verbreitung und was mir an XP unter die Finger kam, war bisher immer der schlichte Aufruf zur Neuinstallation. Ich freue mich schon auf das Gesicht meiner Partnerin, wenn ich ihr ein neues Betriebssystem unterschiebe.

Neues Jahr, neue Wege face-wink
Auch Dir alles Gute im Neuem
Viewfinder
Viewfinder
Viewfinder 01.01.2013 um 07:15:20 Uhr
Goto Top
Das war jetzt ein schneller Ausflug mit heftiger Bremse. Ich schaue natürlich noch nach was falsch läuft.
Ingesamt macht Powershell einen guten Eindruck. Von der Einarbeitungszeit und der Konfiguration auf einem Fremdsystem mal abgesehen, habe ich jetzt folgendes probiert:
get-host
Ausgabe:
Name             : ConsoleHost
Version          : 2.0
InstanceId       : 8fd5830c-34d1-4552-9d7e-a66927a0969e
UI               : System.Management.Automation.Internal.Host.InternalH
CurrentCulture   : de-DE
CurrentUICulture : de-DE
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace
CurrentUICulture : de-DE -> riecht schon wieder nach Codepage. Zumindestens nach den ersten Recherchen.
Also mal die ersten Tests mit Thai-Glyphen. Es läßt sich jetzt so schön kopieren.
get-acl F:\Public\Projects\WWW\testbasis\Test
Ausgabe:
    Verzeichnis: F:\Public\Projects\WWW\testbasis


Path                                    Owner                                   Access
----                                    -----                                   ------
Test                                    Windows-Work\Viewfinder                 Windows-Work\????????? Allow  ReadAn...
Nicht wirklich berauschend. Dann mal weiter mit Verzeichnisnamen.
get-childitem F:\Public\Projects\WWW\testbasis\Test
Ausgabe: (abgekürzt)
    Verzeichnis: F:\Public\Projects\WWW\testbasis\Test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        02.12.2012     17:37            erben ist ein
d----        01.12.2012     13:46            keine Erben
d----        09.12.2012     05:19            Kette
da---        30.11.2012     10:59            mysql
d----        02.12.2012     15:09            Neuer Ordner
d----        06.12.2012     08:17            Starte Erben
d----        02.12.2012     12:30            Unterverzeich
d----        01.01.2013     12:30            ?????????
-a---        30.11.2012     10:57       1778 .htaccess_roo
-a---        30.11.2012     10:57       4297 access.php
-a---        01.12.2012     13:29         56 ACL.txt
-a---        21.10.2012     11:22        152 aclfile.log
-a---        30.11.2012     10:57       4439 autoload.php
-a---        30.11.2012     10:57        264 composer.json
Na wenn das kein guter Start ist. Ich beschäftige nur ungern Armeen mit Haus und Hof einreißen, nur um mal eben die Post zu lesen. Sollte sich der Verdacht bestätigen, das auch Powershell nicht mit UniCode (UTF8 oder was auch immer) klar kommt, lassen wir die Sache besser. Es gibt nur eine CAD-Maschine auf der Windows laufen muss und mit allem anderen verdiene ich keinen Pfennig.

Grüße
Viewfinder
Friemler
Friemler 01.01.2013 aktualisiert um 14:03:54 Uhr
Goto Top
Hallo Viewfinder,

installiere Dir Powershell ISE, dort werden Unicode-Dateinamen richtig angezeigt. Man wird auch bei der Scriptentwicklung etwas unterstützt. Die neuste Version von ISE hat z.B. Codevervollständigung eingebaut.

Aber davon abgesehen, das hier
get-childitem F:\Public\Projects\WWW\testbasis\Test | out-file -encoding UTF8 "$env:USERPROFILE\Desktop\dir.txt"  
sollte Dich zufriedener machen. face-wink

Dig deeper
Friemler
Viewfinder
Viewfinder 02.01.2013 um 09:33:46 Uhr
Goto Top
Hallo Friemler,
dank Deiner Hilfe funktioniert das Speichern ohne Probleme.
Dig deeper
Es gibt nicht mal Literatur auf Thai hier. Powershell hat es wohl noch nicht zum Scanner geschafft. Ich hab mir nen Bagger besorgt. Doch kein Licht am Ende.
Konsoleneinsatz Powershell
- Alles beim altem. Unterscheidet sich in nichts von CMD hinsichtlich der Codpages.
Editoreinsatz Powershell_ise
- Läßt sich auch als Konsole missbrauchen.
- Zeichen werden nur von Objekten interpretiert
- Umschalten der Codepage kein Problem, für alte CMD-Befehle bleibt vermutlich nur Textausgabe (Codepageproblem)
Powershell_ise als Konsole
- Angenehmes arbeiten
- Remotanbindung unklar, da sich gefundene Quellen ausschließlich auf die eigentliche Konsole beziehen und wiedersprüchlich sind.
- "encoding" wird von offensichtlich von mehr Befehlen unterstützt, als in der Hilfe angegeben. Doch es findet sich kein Hinweis, wie ich diesen Parameter zur Bildschirmausgabe einsetzen kann.
- ISE läßt sich mittels Profile einrichten. Wie man Diese auf einen Computer bekommt, bei dem eine Remotverbindung nicht funktioniert, war auf die Schnelle nicht zu klären.

Vermutlich ist mit Blick auf die verschiedenen Codpages nicht alles wirklich klar bei Powershell (http://marcoscheel.de/net/powershell-mit-c-generieren-und-scheitern-uni ..).
Der Lernaufwand hinsichtlich Powershell ist um etliches höher als angenommen. In Bezug auf die geplante IT-Struktur sollte ich die paar Punkte aus meiner Anwenderpraxis mit Windows mal außer acht lassen. Für den Soho-Bereich sehe ich im Moment keine praktikable Lösung unter Windows, mit der ich zentrale Datenverwaltung, mein Broterwerb und Onlineprojekte mit nur einem Betriebssystem handhaben kann. MySOL, PHP, Java, JavaSkript, HTML und CSS binden reichlich Reserven. So das ich im Moment nicht weis, wo ich die Zeit für Powershell hernehmen soll. Die nächsten Tage, werde ich schauen wie komplex das Thema Daten- und Userverwaltung unter Powershell und unter Linux ist.

Grüße
Falkmar
Friemler
Friemler 02.01.2013 aktualisiert um 13:17:53 Uhr
Goto Top
Hallo Viewfinder,

zu dem von Dir verlinkten Artikel: In so einem Fall hätte ich mal versucht, das mit C# erzeugte Powershell-Script als UTF-8 mit BOM (Byte Order Mark) zu speichern. Wenn man sich eine von Powershell ISE gespeicherte Datei in einem Hexeditor anschaut, sieht man auch die in den ersten 3 Byte enthaltene BOM für UTF-8: 0xEFBBBF

Noch ein Tipp: PowerShell output redirection: Unicode or ASCII?

Der ebenfalls in diese Beitrag verlinkte Artikel zeigt Dir dann auch die Lösung für die Zusammenarbeit von Powershell-Script und Legacy-Konsolenprogrammen.

Gruß
Friemler
rubberman
rubberman 02.01.2013 um 18:09:48 Uhr
Goto Top
Hallo Zusammen und ein gesundes neues Jahr allen.

@Viewfinder Nächstes Jahr lade ich mich zu dir ein face-big-smile Mit Schnorcheln in's neue Jahr zu starten, wäre was für mich.
Ich starte mal ein paar Posts weiter oben. Verwirrt vermutlich nur, wenn ich direkt zu den Beiträgen antworte, da letztlich alles chronologisch unten angehängt wird.

Ps.: OEMCP und ACP wird oft bei Google geliefert, doch eine richtige Erklärung habe ich nicht gefunden.
Das OEM (original equipment manufacturer) in OEMCP geht auf die Zeit zurück, da Windows noch auf DOS aufgepfropft lief. Das A in ACP steht für ANSI. Man hat vermutlich aus Kompatibilitätsgründen nie etwas an dieser Unterscheidung geändert. Irgendwie habe ich mich an diesen Stolperstein auch gewöhnt. Man weiß Consoleanwendungen meistens OEMCP, Windowsanwendungen meistens ACP oder Unicode. Hier noch was zum Lesen:
Why ACP != OEMCP (usually)

<"InMitLf.txt" >"OutMitCrLf.txt" more
Funktioniert die Umleitung mit jeder textbasierenden Datei zuverlässig? z.B. ".ht-xyz", "xyz.css" oder "xyz.php"
An der Dateiendung soll's nicht scheitern. Wie zuverlässig MORE arbeitet kommt auf einen Versuch an. Letztlich beruht das Ganze (wie so oft bei Batch) auf undefiniertem Verhalten. Nirgends steht, dass MORE Lf zu CrLf macht und keiner weiß, ob M$ irgendwann auf die Idee kommt daran was zu ändern.
Da das Thema nun in Richtung PowerShell geht, werde ich mehr als stiller Mitleser dabei bleiben. Ich interessiere mich schon dafür Batch wird wohl ohnehin sterben, aber mein Wissen in PowerShell reicht nicht ansatzweise, um Ratschläge zu geben.

Zum Thema mit vs. ohne BOM:
Ich hatte oben schon mal geschrieben
Je nach Editor, mit dem du die Textdatei ...
Das "Editor" kannst du gerne beliebig gegen "Software" austauschen. Je nach dem, wie "intelligent" die Software den Zeichensatz erkennt, ist ein BOM nötig, oder auch nicht. Je nach dem, ob die Software ein BOM erwartet oder nicht, kann es auch gerade mit BOM in die Hose gehen.

Grüße
rubberman
Viewfinder
Viewfinder 03.01.2013 um 06:49:01 Uhr
Goto Top
Falls es jemand bis hierher geschafft hat, ein grosses SORRY. Das Thema CMD ist für mich mangels Support von UniCode erledigt.
Viewfinder
Viewfinder 03.01.2013 um 09:31:00 Uhr
Goto Top
Hallo Friemler,
in Bezug auf diesen Blog weis ich jetzt nicht was die korrekte Verfahrensweise ist. Aus der Topliste ist das Thema raus und es kann recht privat weitergehen. CMD scheidet in meiner Situation wegen der aufgezeigten Probleme aus. Es ist kein Problem ein neues Thema aufzumache, wobei mir hier die rechte Überschrift fehlt.
Das ich mir im Zusammenhang mit Codepage mittlerweile auch noch die Frage nach Hardware (geplant in ca. zwei Jahren) stellen muß, trifft mich vollkommen unerwartet. Ich kann hinsichtlich der aktuellen Diskusion zwar keine Überschrift ausmachen, aber ein paar Schwerpunkte lokalisieren.
- Egal wie ich es drehe, Windows bleibt Bestandteil in zukünftiger IT-Struktur.
- Die IT-Struktur ist mit Ausnahme einer zentralen Datenspeicherung, wenigstens eines Interfaces zum Internet, eines Routers für lokale Netz und einiger Ein- Ausgabe- Geräte nicht definierbar
- Betriebssyteme die ich ausmachen kann sind Windows ab Win7 und bunt gemischte Linux- Varianten. MAC und Android kann ich momentan vernachlässigen.
- Ich muss aus Gründen der Produktivität und der eigenen Sicherheit Desktops (im Sinne von Clients) auf Basis von Linux und Windows in Grenzen warten können. Schwerpunkte sind Datei- benutzer- Verwaltung und Netzwerkschnittstellen.
- Einen Windowsserver wird es nicht geben.
Sorry für diese dürftige Beschreibung, mehr ist im Moment noch nicht fixierbar.

Für Linux ist der Plan klar und der Aufwand nicht gerade gering aber überschaubar. Worum es also geht ist Windows.
Ich brauche eine Konsole unter Windows (remote und lokal). Diese Konsole muss internationale Schriftzeichen handeln können. Bisher sehe ich nur einen Weg je Zeichensatz.
Was unter Windows an den temporären Clients möglichst nicht passieren sollte:
- tiefe Eingriffe in das System. Ok ist schwammig. Falls notwendige Installationen erforderlich werden, muss der temporäre Client (Nutzer, Partner, Mitarbeiter) diese verstehen und rückgängig machen können. Reale OS-Kenntnisse können nicht vorausgesetzt werden.
- Tests und Konfigurationen mittels grafischer Oberfläche. Beim besten Willen. Ich kann nicht jede Sprache lernen, die mir vor die Füße fliegt.
- Veränderungen und sei es nur temporär an der gewohnten Oberfläche. Nennen wir es Zange. Nimm eine Kiste mit stingnormalen Kneifzangen. Teile diese in zwei identische Kisten mit der jeweiligen Aufschrift rechts und links auf. Was glaubst Du, in welche Kiste ich ohne nachdenken trotz besseren Wissens als Rechtshänder greifen würde?

Anmerkung:
Offensichtlich ist Powershell die einzige Möglichkeit. Wenn dem so ist, bleibt die Frage, wie und wo greife ich am besten an. Die Konsole werde ich voraussichtlich ein bis zwei mal im Monat nutzen. Tiefgreifende Kenntnisse und Routine sind demnach nicht möglich. In der Programierung werde ich hauptsächlich mit Plattform unabhängigen Sprachen konfrontiert.

So genug Geschwätz:
Deinen Hinweisen bin ich brav gefolgt:
Abfrage der aktuellen CodePage
PS C:\Windows\system32> $OutputEncoding

IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 2012
Code CodePage aus "Gebietsschema" übernehmen
PS C:\Windows\system32> $OutputEncoding = [Console]::OutputEncoding
PS C:\Windows\system32> $OutputEncoding

IsSingleByte      : True
BodyName          : ibm850
EncodingName      : Westeuropäisch (DOS)
HeaderName        : ibm850
WebName           : ibm850
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : False
IsMailNewsSave    : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 850
Gut. Es wird also etwas einfacher als unter CMD. Ich erhalte den entsprechenden den Zeichensatz, welchen ich in der grafischen Oberfläche von Windows benutze. Oder Schrittweise - Umstellen des Gebietsschema, Rechner neustarten und "$OutputEncoding = [Console]::OutputEncoding" in die Konsole tippen. Alternative ist die Umleitung über eine Datei.
So weit ich es begriffen habe, ergibt sich folgender Umstand.
- In eine Datei können beliebige Zeichen eingelesen werden.
- Das Auslesen und anzeigen von Daten wird jedoch nur in der jeweils aktuellen Codpageversion unterstützt (Anfängerthese).

Weitergraben
Nun liegt es nahe, das ich mal eben die Codepage ändern möchte, ohne das System zu vergewaltigen.
PS C:\Windows\system32> $OutputEncoding.EncodingName
Westeuropäisch (DOS)
Aktueller Name schnell ermittelt. Na dann eben mal fix zurück stellen auf "US-ASCII".
Wrong Code
$OutputEncoding = [Console]::US-ASCII
Fehlversuch und noch zu inkompetent um mit der Hilfe zu arbeiten.
Für eine Einfache Abfrage reicht es jedoch schon
Nachfolgende Abbildung ist brutal abgekürzt
PS C:\Windows\system32> get-help $OutputEncoding
THEMA
    Einstellungsvariablen

KURZBESCHREIBUNG
    Variablen zur Anpassung des Verhaltens von Windows PowerShell
KURZBESCHREIBUNG
    Variablen zur Anpassung des Verhaltens von Windows PowerShell

DETAILBESCHREIBUNG
    Windows PowerShell enthält einen Satz von Variablen, mit denen
    Sie das Verhalten anpassen können. Diese "Einstellungsvariablen"  
    werden analog zu den Optionen in GUI-basierten Systemen verwendet.

    Die Einstellungsvariablen wirken sich auf die Betriebssystemumge-
    bung von Windows PowerShell sowie auf alle in der Umgebung
    ausgeführten Befehle aus. In vielen Fällen verfügen die Cmdlets
    über Parameter, mit denen Sie das bevorzugte Verhalten für einen
    bestimmten Befehl überschreiben können.

In der folgenden Tabelle sind die Einstellungsvariablen und ihre
Standardwerte aufgeführt.

Variable                             Standardwert
--------                             -------------
...                                  ...
$OutputEncoding                      ASCIIEncoding-Objekt
...                                  ...
Nach meinem Verständnis heißt das kurz. Alle Einstellungen wirken systemweit. Das System arbeitet aber offensichtlich nicht mit "ASCIIEncoding-Objekt". Gibt es eine Möglichkeit zur Ersetzung von "ASCIIEncoding-Objekt" für die Konsole? Da ASCII Sinn macht, sollte diese Ersetzung temporär sein.

OH: Es geht auch einfacher. Solange man nur auf dem eigenen Rechner Arbeitet, kann man sich nette Profile einrichten und mit powershell_ise arbeiten. Doch diese Möglichkeit bringt weitere Fragen.
- Einsatz auf mobilen Datenträger
- Remotanbindung

Alles im allem sehe ich im Moment noch kein Land. Sorry es ist als erste richtige Programiersprache eben nicht wirklich einfach mit Powershell.

Grüße
Viefinder
Viewfinder
Viewfinder 03.01.2013 um 10:09:18 Uhr
Goto Top
Sei gegrüßt im neuem Jahr,
@Viewfinder Nächstes Jahr lade ich mich zu dir ein face-big-smile Mit Schnorcheln in's neue Jahr zu starten, wäre was für mich.
Können wir gerne per PM nageln. Sind ja Biere offenface-wink

Mit den Posts habe ich so meine Schwierigkeiten. Es ist gut fürs Nachrichtensystem organisiert. Thematisch muss man als Autor vermutlich eine Strategie entwickeln. Es ist meine erste aktive Beteiligung an einem öffentlichen Forum.

Das Thema Batch ist vom Tisch. Ich habe heute einen thematische Strich gezogen. Wie es weitergeht? Keine Ahnung. Ich bekomme auch Powershell nicht so schnell in den Griff. Alle Probleme die ich mit CMD umgehen wollte, schlagen jetzt zu.
Für den professionellen Bereich sicher kein Thema. Einen Spezialisten für jeden Bereich. Das ist mit schmaler Tasche auch über Dienstleistungen nicht realisierbar. Es gibt gute industriell gefertigte Lösungen. Diese basieren jedoch nicht auf Windows. Es gibt jede Menge Standards im Anwendungsbereich, die wiederum von keinem alternativen Betriebssystem unterstüzt werden. Um was es jetzt dem Grunde nach geht, ist der Spagat das alles mit Halbwissen unter einen Hut zu bekommen. Alles was ich will, ist ein sauberer, möglichst störungsfreier Arbeitsplatz. Es muss ja kein Flugzeug zum Fahrad fahren sein. Doch bewegen sollte es sich schon, ohne permanant abgeschossen zu werden, oder sich in Einzelteile auf zu lösen. Ich mag diese Phase (Findung der optimalen Konfiguration) überhaupt nicht. Es ist wie Rechner zusammen bauen. Das Ding läuft ewig, macht was es soll und ich kann es reparieren. Wenn dann der Tag der Trauer kommt, bin ich plötzlich umzingelt von Außerirdischen. Alles hat sich verändert. Ich erhole mich gerade vom ersten Schritt. Einen NT4-Server mit ISDN-Karte wird es nicht mehr geben. face-wink

Gut das ich noch eine Weile entspannen kann. Unter Zeitdruck ist diese Aufgabe nicht lösbar.
Grüße
Viefinder
Friemler
Friemler 03.01.2013, aktualisiert am 04.01.2013 um 00:35:27 Uhr
Goto Top
Hallo Viewfinder,

Powershell basiert auf .Net Framework. Console ist eine .Net-Klasse und hat die Eigenschaft OutputEncoding, die wiederum vom Typ der Klasse Encoding ist. Diese Klasse hat schließlich u.a. folgende Eigenschaften


Eigenschaft Typ/Klasse Zeichencodierung
ASCII ASCIIEncoding 7-Bit ASCII Codierung
BigEndianUnicode UnicodeEncoding UTF-16 Big Endian Codierung
Unicode UnicodeEncoding UTF-16 Little Endian Codierung
UTF32 UTF32Encoding UTF-32 Little Endian Codierung
UTF7 UTF7Encoding UTF-7 Codierung
UTF8 UTF8Encoding UTF-8 Codierung


Die als Typ angegebenen Klassen repräsentieren die verschiedenen von .Net Framework unterstützten Zeichencodierungen. Statt
$OutputEncoding = [Console]::US-ASCII
hättest Du
$OutputEncoding = [Text.Encoding]::ASCII
schreiben müssen, da Console keine Eigenschaft US-ASCII hat.

Text ist der sog. Namespace, innerhalb dessen die Klasse Encoding deklariert ist. Die eckigen Klammern teilen Powershell mit, dass es ich um eine Klasse von .Net Framework handelt, die :: trennen die Klassenbezeichnung von ihren Eigenschaften.

Was auch funktionieren würde:
$OutputEncoding = New-Object -TypeName Text.ASCIIEncoding
Damit wird eine neue Instanz/ein Objekt der ASCIIEncoding-Klasse erzeugt, die ebenfalls im Namespace Text deklariert ist, und der Variablen $OutputEncoding zugewiesen.


OK, jetzt sind wir natürlich voll drin in der objektorientierten Programmierung. Man kommt aber mittlerweile kaum noch darum herum, sich wenigstens in den Grundzügen mit diesem Programmierparadigma vertraut zu machen, OOP ist überall.


Bei der Ausgabeumleitung in eine Datei verwendet Powershell standardmäßig UTF-16 Little Endian (kann durch den Encoding-Parameter des Out-File-cmdlets geändert werden). Der Inhalt von $OutputEncoding beeinflusst nur, welche Zeichencodierung bei der Ausgabeumleitung an ein Programm verwendet wird. Deshalb ist ein
$OutputEncoding = [Console]::OutputEncoding
notwendig, bevor man die Ausgabe eines Powershell cmdlets an ein Legacy-Konsolenprogramm weiterleitet. Dadurch wird die Ausgabe des cmdlets in die Zeichencodierung konvertiert, die die Konsole benutzt. Falls in dem Zeichenstrom Zeichen enthalten sind, die die Konsolen-Codepage nicht kennt, werden an diesen Stellen Fragezeichen eingesetzt.

Bei der Aussage aus der Hilfe
Die Einstellungsvariablen wirken sich auf die Betriebssystemumge-
bung von Windows PowerShell sowie auf alle in der Umgebung 
ausgeführten Befehle aus.
handelt es sich um die (durch Übersetzung verschlimmerte) verklausulierte MS-Version von
Bei den  Einstellungsvariablen handelt es sich um das Pendant zu
den Umgebungs-/Environmentvariablen aus der altbekannten CMD-Shell.


Btr. Powershell Hilfe:
get-help <Befehl> -full
oder
get-help <Befehl> -online


Ein paar Links:

Zeichencodierung:
Zeichencodierung in .NET Framework
System.Text-Namespace

Powershell allgemein:
Mastering Powershell
MSXFAQ.de zum Thema Powershell (enthält viele weiterführende Links)

Remote Powershell:
Administrator’s Guide to Windows PowerShell Remoting
Layman’s guide to PowerShell 2.0 remoting


Gruß
Friemler
Viewfinder
Viewfinder 04.01.2013 um 01:30:02 Uhr
Goto Top
Moin, Moin,
heute bin ich etwas frührer aufgestanden und gehe die Sache mal als Maurer an. Also Stein für Stein.

Was ich will, ist eine Konsole mit der ich unter Windows Systemwartungsaufgaben und Automatisierungen ausführen kann. Diese Konsole muss alle vom System selbst erzeugten Zeichen unterstützen. Nicht irgendwie nacheinander, sondern so wie diese Zeichen als Datei-, Computer- oder User- Namen auftauchen können. Mit ASCII ist das nicht zu machen, es bleibt nur UniCode oder etwas ähnliches z.B. UTF-xyz.
Wenn Powershell mit allen durch das Betriebssystem erzeugten Zeichen umgehen kann, dann lohnt sich die Einarbeitung für mich. Wenn nicht, muss ich nach Skriptinghilfe betteln gehen.
Beispiel: Ein temporärer Schnitt einer Konstelation hat folgenden Schwerpunkt
Dateienamen in
deutsch, spanisch, thai, arabisch

Computernamen in
türkisch, Chinesisch, Nepaly

Typische Aufgaben des Einäugigen sind
Netzwerkanbindung, Namensauflösung, Dateiberechtigungen und Behebung von Kompatibilitätsproblemen



Zurück zu den Steinen. Die von uns betrachteten Links haben ihren Hintergrund vermutlich in der Hilfe von Powershell
Auszug aus der Hilfe von PS:
$OutputEncoding
---------------
       Bestimmt den Typ der Zeichencodierung, die von Windows
       PowerShell beim Senden von Text an andere Anwendungen
       verwendet wird. Wenn eine Anwendung beispielsweise
       Unicode-Zeichenfolgen an Windows PowerShell zurückgibt, muss
       der Wert möglicherweise geändert werden, um die Zeichen
       ordnungsgemäß zu senden.

        Gültige Werte: Objekte, die von einer Encoding-Klasse
                       abgeleitet wurden, beispielsweise ASCIIEncoding,
                       SBCSCodePageEncoding, UTF7Encoding, UTF8Encoding,
                       UTF32Encoding und UnicodeEncoding.

        Standard: ASCIIEncoding-Objekt (System.Text.ASCIIEncoding)

    BEISPIELE

       In diesem Beispiel wird veranschaulicht, wie der Befehl
       FINDSTR in Windows PowerShell auf einem Computer verwendet
       wird, der für eine Sprache mit Unicode-Zeichen wie Chinesisch
       lokalisiert wurde.

       Mit dem ersten Befehl wird der Wert von "$OutputEncoding"  
       gesucht. Da der Wert ein Codierungsobjekt darstellt, sollte
       nur die EncodingName-Eigenschaft angezeigt werden.

          PS> $OutputEncoding.EncodingName # Aktuellen Wert suchen
          US-ASCII

       In diesem Beispiel werden mit einem FINDSTR-Befehl zwei
       chinesischen Zeichen in der Datei "Test.txt" gesucht. Wenn der  
       FINDSTR-Befehl in der Windows-Eingabeaufforderung (Cmd.exe)
       ausgeführt wird, sucht FINDSTR die Zeichen in der Textdatei.
       Wenn Sie den gleichen FINDSTR-Befehl jedoch in Windows
       PowerShell ausführen, werden die Zeichen nicht gefunden, da
       sie von Windows PowerShell in ASCII-Text statt in Unicode-Text
       an FINDSTR gesendet werden.

          PS> findstr <Unicode-Zeichen>         # findstr für die Suche verwenden
          PS>                                   # Nichts gefunden


       Legen Sie den Wert von "$OutputEncoding" auf den Wert der  
       OutputEncoding-Eigenschaft der Konsole fest, die auf dem für
       Windows ausgewählten Gebietsschema basiert, um den Befehl in
       Windows PowerShell zu verwenden. Verwenden Sie doppelte
       Doppelpunkte (::) im Befehl, da OutputEncoding eine statische
       Eigenschaft der Konsole ist.

          PS> $OutputEncoding = [console]::outputencoding
          PS>                               # Gleichen Wert festlegen wie
                                              OutputEncoding-Eigenschaft
                                              der Konsole
          PS> $OutputEncoding.EncodingName
          OEM United States
                                            # Ergebniswert suchen

       Nach dieser Änderung werden die Zeichen vom Befehl FINDSTR
       gefunden.

          PS> findstr <Unicode-Zeichen>
          test.txt:         <Unicode-Zeichen>

                                        # findstr für die Suche verwenden Sucht die
                                          Zeichen in der Textdatei.
Zusammenfassung in Steinchen
- Das Zeichenformat der Konsole kann mittels "$OutputEncoding" beeinflußt werden.
- "$OutputEncoding" ist per Standard immer ein "ASCIIEncoding-Objekt".
- Mit "$OutputEncoding = [console]::outputencoding" kann das aktuelle Gebietsshema des Windows übernommen werden, auf dem die Konsole läuft.
- Mittels "-encoding Wunschformat" sind UniCode- Formatierungen der Ausgaben möglich. "-encoding Wunschformat" steht nur für eine beschränkte Anzahl von Objekten zur Verfügung. Keines dieser Objekte ermöglicht eine Anzeige auf der Konsole.

Gut, damit hätten wir dann den Unterschied zu CMD. Ausgabe mit UniCode in Datei ist möglich. Zum Auslesen und Anzeigen kann ich mir ja etwas auf einem alternativen OS schreiben face-wink. Ernsthafter betrachtet findet sich eines immer wieder. "Standard: ASCIIEncoding-Objekt (System.Text.ASCIIEncoding)". In diesem Zusammenhang komme ich mit der Hilfe nicht weiter. Doch es gibt Internet.
Powershell beruht auf Framework. Oder ist es Framework? Wenn ja kann man hoffen, wenn nicht sieht es vermutlich dunkel aus. In der Referenz von Framework ist von Java und sogar JavaSkript die Rede. Wenn eines von beiden eine Konsole zur Erledigung von Wartungsaufgaben hätte, wäre mein Problem vermutlich behebbar. Das was mich beunruhigt ist der Umstand, das Powershell mit keiner Silbe erwähnt wird. Ich sehe keinen Weg für "(System.Text.utf-8)".
Encoding Class .NET Framework 2.0 Namespace: System.Text
Nun könnte man hoffen, das alles besser wird. Mal schauen was Framework 4.5 so sagt.
Encoding Class .NET Framework 4.5 Namespace: System.Text
Hier hat sich offenbar etwas in den Klassen getan. Leider sagt mir das bisher nicht viel und Powershell ist ebenfalls nicht vertreten.

Sofern ich nicht vollkommen neben dem Tritt laufe, stellt sich aus meiner Sicht eine primäre Frage.
Ist "System.Text.xyz" auch für Unicodes brauchbar? Wenn ja, wie?

Grüße
Viewfinder
Viewfinder
Viewfinder 04.01.2013 um 01:34:14 Uhr
Goto Top
Guten Morgen Friemler,
da war ich aber langsam face-wink Ich schiebe es mal auf meine EGDE-Verbindung und lese mich rasch ein. Eventuell ist dann mein letzter Beitrag Sinfrei. Auf zu neuen Links und erstmal Danke.

Grüße
Viewfinder
Viewfinder
Viewfinder 04.01.2013 um 07:58:13 Uhr
Goto Top
Ich zeig Euch mal was. face-wink
In letzter Verzweiflung habe ich die Suchstrategie geändert. Sieht hier jemand irgendwas mit 874?

19f67d08abf230d30a491086577db086

Ich gehe der Sache mal nach, denn auch mit durchschnittlicher Auffassungsgabe sollte es schneller vorwärts gehen. In Punkto Registry flattert mir etwas das Hemd, doch ich glaube das kann ich backen. Wenn sich der Verdacht bestätigt, heißt die Alternative immer noch Powershell. Aber Batch wird noch lange leben, da die Konsole offensichtlich die gleiche wie CMD ist.

Ich brauch jetzt erst mal ein wenig Zeit, denn die neue Unicodeschrift hat schlappe 23 MB. Of corse, I have to restart after every chois. face-wink

bis später
Viewfinder
rubberman
rubberman 04.01.2013 aktualisiert um 15:11:27 Uhr
Goto Top
Hallo Viewfinder.

Sieht hier jemand irgendwas mit 874?
Wie meinst du das? Hier hat doch die 874 (als Codepage) gar nichts verloren. Es geht hier um alternative True Type Schriftarten (Lucida Console, Consolas). Diese sind monospaced (jedes Zeichen hat die gleiche Breite) um in einem Consolefenster vernünftig dargestellt werden zu können und unterstützen in gewissem Umfang Unicodezeichen. Diese kannst du (wie oben schon mal beschrieben) entsprechend einstellen und verwenden.

Aber Batch wird noch lange leben, da die Konsole offensichtlich die gleiche wie CMD ist.
Das hat nichts miteinander zu tun. Consoleanwendungen öffnen im Consolefenster. Die CMD ist da nur im Spiel, wenn diese Anwendungen von der CMD aufgerufen werden face-wink

Grüße
rubberman
Viewfinder
Viewfinder 05.01.2013 aktualisiert um 02:14:04 Uhr
Goto Top
Morgen rubberman,
Aber Batch wird noch lange leben, da die Konsole offensichtlich die gleiche wie CMD ist.
... Die CMD ist da nur im Spiel, wenn diese Anwendungen von der CMD aufgerufen werden ...
Koennen wir das noch ein wenig nageln. (Ich hoffe ich werde jetzt nicht mit Steinen beworfen). Denn genau das ist vermutlich der Punkt, warum auf meiner Seite alles streikt.
- Was genau kann ich mir unter Konsole vorstellen (Software face-wink ich weis)? Die Software reagiert absolut identisch unter CMD und PS.
- Wo werden für die oder jeweilige Konsole die Schriftarten definiert?

Heute nur ein schneller Ausflug zwischen lahmer Leitung und Stromausfällen. Friemler kann sich noch so viel Mühe geben, die gewünschten Zeichen werden einfach nicht dargestellt. Das hat eine Ursache. Ich zeige mal was auch nicht funktioniert und dennoch eine koriose Auswirkung hat.
ccb6ff580fdbcff62ccd3d6d64262754
Geplant war die Änderung der Standardschrift in der Konsole. Was ich sehen kann ist ist die Beschneidung der Schriftsätze.
Ich mache mal ein Beispiel und hoffe Friemler hat eine Erklärung für den Ablauf. Irgendwie habe ich "$OutputEncoding = [Console]::OutputEncoding" noch nicht wirklich verstanden.
PS C:\Windows\system32> chcp 874
Aktive Codepage: 874.
PS C:\Windows\system32> $OutputEncoding


IsSingleByte      : True
BodyName          : us-ascii
EncodingName      : US-ASCII
HeaderName        : us-ascii
WebName           : us-ascii
WindowsCodePage   : 1252
IsBrowserDisplay  : False
IsBrowserSave     : False
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.EncoderReplacementFallback
DecoderFallback   : System.Text.DecoderReplacementFallback
IsReadOnly        : True
CodePage          : 20127



PS C:\Windows\system32> $OutputEncoding = [Console]::OutputEncoding
PS C:\Windows\system32> $OutputEncoding


IsSingleByte      : True
BodyName          : windows-874
EncodingName      : Thailändisch (Windows)
HeaderName        : windows-874
WebName           : windows-874
WindowsCodePage   : 874
IsBrowserDisplay  : True
IsBrowserSave     : True
IsMailNewsDisplay : True
IsMailNewsSave    : True
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : True
CodePage          : 874
Was in diesem Beispiel gut zu sehen ist, das "ä". Vor meiner Registry-Änderung gab es dieses nicht. Da dieses ä im Zusammenhang mit mit Codpage windows-874 theoretisch nicht darstellbar ist , kann es sich nur um eine Unicodeschrift handeln. Consolas und Lucids Console stellen das "ä" dar, erst mit Umschalten auf Rasterschrift geht es unwiederbringlich verloren. Die Eingabe von "$OutputEncoding" zaubert das "ä" wieder an seinen angestammten Platz. Die Formatierung der Ausgabe läuft vermutlich etwas komplexer (RAM ???). Meine Vermutung,
"The lack of Unicode support in PowerShell console is not a bug."
Ein Blick in das Schriftenverzeichnis und der Verlust meiner Originaldatei bestätigen es immer mehr. Ich schaue mir dieses Verzeichnis und die entsprechenden Dateien mit einen alternative OS an.
Hier gibt es eine Unicodeschrift die als umfangreich im Internet beschreiben wird. Sorry für den direkten Link auf die Datei.
http://de.sourceforge.jp/projects/sfnet_allfonts/downloads/ARIALUNI.TTF ...
Alle mit "uni" bezeichneten Dateien auf meinem Win7-System sind abgespeckt. Ich schaue mir die Sache noch auf meinen Nootbooks an.
Einer bootet XP mit chinesischen Menü. Diese Glyphen sind aber vermutlich Standard in den Unicodes von Mircrosoft. Interessant wird es dann bei dem Thainotebook. Hier weis ich noch nicht, was da wirklich werkelt.

Die Hauptfrage ist für mich im Moment. Wie bekomme ich die Konsole dazu überredet, unter anderem Thai- Glyphen darzustellen?
Im Moment sehe ich nur folgende Wege, ohne zu wissen ob es es wirklich Erfolg haben kann.
- Installation zusätzlicher Sprachpakete (bei MUI zusätzliche Lizenz erforderlich)
- Installation von Microsoft Office mit ostasiatischer Unterstützung (ebenfalls kostenpflichtig)
- Konfiguration der Konsole zur Nutzung einer Unicodeschrift, die die gewünschten Glyphen enthält

Ich hoffe es wird nicht zu langweilig oder chaotisch.
Grüße
Viewfinder

Ps.: Gibt es hier zum Einbinden von Grafiken einen etwas angenehmeren Weg? Ich muss hier immer über den doch recht langen Beitrag scrollen. Idee wäre einen Beitrag zu erstellen der nur die Grafiken enthält und ausschließlich von mir eingesehen werden kann.
rubberman
rubberman 05.01.2013 um 03:59:32 Uhr
Goto Top
Hallo Viewfinder.

Nun habe ich professionell nichts mit der Materie zu tun. Heißt, ich habe mir mein gefährliches Halbwissen nur erlesen. Ich versuche trotzdem mal zu erklären was unter Console/-anwendungen zu verstehen ist.

Die Definitionen gehen da etwas auseinander, aber eine gemeinsame Kernaussage lässt sich in diesem Fall schon erkennen.
Die Console ist textbasiert. Heißt, das Interface zwischen Mensch und Maschine ist auf die Eingabe per Tastatur (Standard Input), sowie die normale Textausgabe (Standard Output) und die Fehlertextausgabe (Standard Error) begründet.

Windows im speziellen hat dafür dieses typische "grau auf schwarz" Fenster, das wohl auf DOS zurück geht. Dort gelten eigene Regeln. So kannst du beispielsweise Pixel nahezu vernachlässigen; diese werden nur gebraucht um die Größe der Schrift und des Cursors zu beschreiben. Die eigentliche Einteilung eines solchen Fensters erfolgt in Character Cells (vergleichbar mit Spalten und Zeilen einer Tabelle). Jede dieser Cells kann ein Zeichen aufnehmen und anzeigen. Ich glaube das reicht schon um den Unterschied zwischen einem Windows Consolefenster und einer grafischen Benutzeroberfläche (wo man mit der Maus auf Schaltflächen rangiert, Text mit Funktionen belegen kann (zB. Links), Bunte Bildchen einbinden kann, etc., etc.) klar zu machen.

Was nun Einstellungen für Consolefenster angeht: Per Rechtsklick auf den oberen Fensterrand kommst du in die entsprechenden Menüs. Da gibt es die Standardwerte für alle Consolefenster und die Eigenschaften für die spezielle Anwendung. Hinzufügen von Schriftarten geht wenn du sie in der Registry einträgst, dazu muss diese Schriftart aber auch für die Console geeignet sein (bspw. monospaced wegen der Darstellung in den Character Cells).

Inwiefern dir das letztlich hilft, ist immer noch die Frage. Das einzige was dir das bringt, ist die korrekte Anzeige in einem Consolefenster (falls du es schaffst). Das hat aber noch lange nichts mit der Verarbeitung dieser Zeichen zu tun (siehe Punkt 4 meines Versuches mit dem kyrillischen Benutzername).

Grüße
rubberman
Friemler
Friemler 05.01.2013, aktualisiert am 08.01.2013 um 12:15:57 Uhr
Goto Top
Hallo Viewfinder,

Asche auf mein Haupt, die gleichzeitige Anzeige von Schriftzeichen aus verschiedenen Kulturen ist doch schwieriger als ich dachte. Aber ich glaube, dass ich eine brauchbare Lösung gefunden habe. Testen musst Du das ganze. face-wink


1. Was ist eine Konsole?

Für den Anwender ist eine Konsole eine textbasierte Benutzerschnittstelle, meist mit schwarzem Hintergrund und grauer Schrift. Meistens wird sogar das Programm CMD darunter verstanden, obwohl es auch andere Konsolen gibt, z.B. SQLCMD als textbasierte Schnittstelle zum MS SQL Server.

Für einen Windows-Programmierer ist eine Konsole etwas anderes. Eine Konsole ist eine Programmierschnittstelle, die von Windows zur Verfügung gestellt wird. Zu einer Konsole gehören ein InputBuffer zur Eingabe und ein oder mehrere ScreenBuffer zur Ausgabe. Zu einem ScreenBuffer gehört eine Codepage.

Wenn ein Programm gestartet wird, wird ein Prozessobjekt und ein Objekt für den Hauptthread dieses Prozesses erstellt. Es wird ein sog. Handle, im Endeffekt eine Nummer, auf das Prozessobjekt zurückgeliefert. Der neue Prozess kann dann entweder die Konsole des Elternprozesses erben oder für ihn wird eine neue Konsole erstellt. Es ist auch möglich, dass ein Prozess garkeine Konsole erhält, das ist z.B. bei GUI-Programmen, deren Benutzerschnittstelle anders funktioniert, oder bei Windows-Diensten, die keine Benutzerschnittstelle haben, der Fall.

Eine Konsole ist aber auch nur ein Windows-internes Objekt und nicht gleichbedeutend mit einem Fenster auf dem Bildschirm! Einem Programm kann eine Konsole zugeordnet sein und trotzdem hat es kein Bildschirmfenster. Das Erstellen eines Fensters und dessen Zuordnung zu einer Konsole ist ein optionaler Schritt.


2. Wodurch wird die Anzeige von Unicode-Zeichen in einem Konsolenprogramm behindert?

  • Der verwendete Zeichensatz muss die gewünschten Unicodezeichen enthalten, was, wie Du schon erkannt hast, bei den meisten Zeichensätzen unter Windows nicht der Fall ist. Der kompletteste Zeichensatz ist Arial Unicode MS, der jedoch erst nach der Installation von MS Office auf dem System vorhanden ist (oder man besorgt ihn sich aus dem Netz face-wink ).
    Aber auch Arial Unicode MS implementiert nicht alle Zeichen aus der Basic Multilingual Plane (BMP) von Unicode (die Codepoints, die sich mit zwei Bytes codieren lassen). Es gibt jedoch ein Community-Projekt namens GNU Unifont, das einen Monospaced True Type Font zur Verfügung stellt, der die komplette BMP implementiert. Er basiert allerdings auf einer Rasterschriftart und sieht nur in der Schriftgröße 12pt gut aus.
  • Ein Zeichensatz muss, wie rubberman schon sagte, gewisse Voraussetzungen erfüllen, damit er für ein Konsolenprogramm verwendet werden kann. Arial Unicode MS ist eine Proportionalschrift und deshalb unbrauchbar. Auch die meisten Monospaced-Fonts sind unbrauchbar. In diesem Artikel steht dazu genaueres.
  • Das Ändern der für die Konsole eingestellten Codepage mit der Windows-Funktion SetConsoleOutputCP muss funktionieren, was auch nur unter bestimmten Bedingungen der Fall ist.


3. Wie sieht die Lösung aus?

  • Man muss sich den GNU Unifont herunterladen und installieren. Bis XP genügte das kopieren der TTF-Datei in das Fonts-Verzeichnis von Windows, seit Vista muss man einen Rechtsklick auf die TTF-Datei ausführen und aus dem Kontextmenü Installieren auswählen (Adminrechte erforderlich).
  • Man benötigt einen Konsolenemulator, z.B. ConEmu. Damit werden Konsolenprogramme gestartet ohne ein Fenster zu erstellen, die Ausgaben werden abgefangen und in einem Pseudo-Konsolenfenster angezeigt. Dazu wird eine GUI verwendet, die nur wie ein Konsolenfenster aussieht, deshalb gelten die Einschränkungen für Konsolenfenster hier nicht.
  • In ConEmu auf das Systemmenü klicken und Settings auswählen oder Win+Alt+P drücken und die folgenden Einstellungen vornehmen:

261c908279e4f3048000b3182a9ff696
Den Unifont als Zeichensatz auswählen und als Größe 16pt einstellen, angezeigte Größe ist dann 12pt.


b84606775579234eb464d1e155d73f94
In dem markierten Eingabefeld folgendes Kommando eintragen:
powershell -ExecutionPolicy RemoteSigned -NoExit -Command "$OutputEncoding=[Text.Encoding]::Unicode; cd "$env:USERPROFILE";"  
Dazu muss das Installationsverzeichnis von Powershell Bestandteil der PATH-Variablen sein. Mit dem Befehl wird Powershell gestartet und mit den Parametern angewiesen

  • die ExecutionPolicy temporär (für die Dauer der aktuellen Sitzung) so einzustellen, dass die Ausführung von lokal erstellten Scripten möglich ist,
  • das Outputencoding (für die Ausgabeumleitung zu Programmen) auf UTF-16 Little Endian umzustellen,
  • den Profilordner des aktuellen Benutzers zum aktuellen Verzeichnis zu machen
  • und sich danach nicht zu beenden.

Wenn Powershell mit EXIT verlassen wird, schließt sich auch ConEmu.


CMD ließe sich so auch einbinden, denn wie rubberman ja schon vor ein paar Tagen gezeigt hat, kann auch CMD bei der Ausgabeumleitung in eine Pipeline oder eine Datei in Unicode ausgeben. Man müsste also
cmd /u /k "cd /d "%UserProfile%""
in obiges Eingabefeld eintragen. Viel Nutzen bringt Dir das aber nicht, da die Konsolenbefehle nicht Unicode-fähig sind.


Gruß
Friemler
Viewfinder
Viewfinder 06.01.2013 um 01:09:33 Uhr
Goto Top
Hallo rubberman,
wir schwimmen alle in eine Richtung face-wink Monospace ist einer der Faktoren. Doch vermutlich reicht das noch nicht aus. Ich schreibe etwas mehr zur Thematik weiter unten bei Friemler.

Gut das wir das ganze Theater hier machen. Langsam kristalliert sich Windows als Risikofaktor in der geplanten Produktiv-Umgebung heraus.

Grüße
Viewfinder
Viewfinder
Viewfinder 06.01.2013, aktualisiert am 07.01.2013 um 02:32:04 Uhr
Goto Top
Ein letzter Versuch (Schriftinstallation für Konsole) ist im nachfolgendem Bild dokumentiert. Im Menü der Eigenschaften tauchen nur Monospace- Fonts auf. Es findet demnach also eine Prüfung statt. Das Einbinden von Microsoft- Monotyps funktioniert soweit erst einmal. Die Schrift "DejaVu Sans Mono" wurde von mir mittels "Font Manager" unter "Ubuntu" getestet. Sie enthält Thai-Glyphen, gibt diese jedoch über die Konsole nicht aus. Eine Eingabe ist weder per Tastatur noch mittels copy/past möglich. Es scheitert also schon bei (ich nennen es mal) Mono-Codepage.
ea9756650289dbc314baad270f36bafe

Hallo Friemler,
... Asche auf mein Haupt, die gleichzeitige Anzeige von Schriftzeichen aus verschiedenen Kulturen ist doch schwieriger als ich dachte. Aber ich glaube, dass ich eine brauchbare Lösung gefunden habe. Testen musst Du das ganze ...
Asche brauchen wir nicht. Wenn doch, dann hätte ich Da eine Idee face-wink. Wobei fairer Weise auch noch die Schnittstellenproblematik der IPods eine Betrachtung wert wäre.

Bei so einer Anleitung bin ich mehr als neugierig. Ich werde testen, aber erst morgen. Heute ist mein sozialer Tag.

... Viel Nutzen bringt Dir das aber nicht, da die Konsolenbefehle nicht Unicode-fähig sind.
Genau das war meine Befürchtung, womit ich den nun mittlerweile faktisch falschen "EDIT" in der Einleitung zu diesem Blog wohl ändern muss.
Im Hinterkopf reift bereits eine neue IT-Struktur, bei der CDM und oder PowerShell nur noch im Zusammenhang mit mit dem optional startbaren CADsytem eine Rolle spielen. Doch auch hier sind erste Bemühungen zu sehen, die das Zusammenarbeiten von Teams plattformunabhängig ermöglichen sollen. Bis her nennt sich sowas meistens Wolke-irgendwas und ist als Endnutzer, genau so verschleiert zu verstehen. Die Standarts welche ich als Endnutzer zwischen "Cloud" und "Client" sehen kann, sind in der Regel "http", "https", ganz selten "ftp". Es finden sich ebenfalls Dienste die ich als Server bezeichnen würde. Mit diesen wird man jedoch auf der Ausgabeseite nicht konfrontiert oder es gibt ein Grafische Konsole, die ich als ambitionierte Laie mit "GUI" bzw. thematisch "PowerShell-ISE" bezeichnen würde. Gibt es Probleme mit der Kommunikation, liegt die Serviceverantwortung auf der jeweiligen Seite. Ein Problem das ich für eine sich ständig ändernde lokale Struktur harmonisieren wollte. Warum ich mich nun langsam von "PowerShell-ISE" entferne, versuche ich mit dem Beispiel "DIR" darzustellen.

Was ich glaube verstanden zu haben, mal als kleine Zwischenklausur:
Bit-Code
- Binärer Code (0 und 1) der durch seinen Wert in Abhängigkeit seiner Länge definiert wird
Alles andere ist gut 30 Jahre her (arbeite noch an der Krankschreibung)

Zeichendarstellung
- Darzustellenden Zeichen werden in Codepages (Zeichentabellen) mittels Bit-Code definiert
- Das Bild, die Darstellung oder der Charakter eines Zeichens ist in Fonts (Schrifttypen) definiert
- Die grafische Darstellung eines Zeichens ist abhängig vom Zeichengenerator (Software) des Betriebssystemes (inkl. Roms)
- Sogenannte Textmodi erfordern in der Regel nichtpropurtionale Schriften (Monotypes) deren feste Größe über Pixel-Raster (z.B. 8x8, 64 Punkte je Zeichen) definiert ist.

Codepages
- Zeichentabellen in denen die Zuordnung des jeweiligen Zeichens zu einem binärwert und oder Hexadezimalwert erfolgt
- Die Anzahl der darstellbaren Zeichen hängt von der Bit-Maske (Anzahl der Bitwerte 0 und 1) ab
- unterschieden wird hier häufig in Codpages mit fester Maske (7 oder 8 Bit) und Unicode

Schrifttypen
- Als Datensatz gespeichertes Abbild eines Schriftsatzes
- Das jeweilige Abbild wird über den Hexadezimalwert der Codpage abgerufen
- Eine auffällige Unterteilung ist zwischen Vektor-Types für Grafigdarstellung und Raster-Types für Textmodus auszumachen

Konsole (programier-technisch)
- Software-basierende Schnittstelle zwischen Eingabe und Ausgabe
- Grafische Ausgabe erfolgt in der Regel direkt zum Monitor
- Ist Textbasierend

CMD
- Software die Dos-Befehle Zeilenweise interpretiert
- Ein- und Aus- gabe sind textbasierend
- Ein- und Aus- gabe erfolgen in der jeweiligen Codepage
- Textdarstellung erfolgt mittels Konsole die 7Bit-, 8Bit-Codepages und Rastertypes erfordert

Powershell.exe
- Software die Dos-Befehle Zeilenweise interpretiert
- Objektorientierte Software mit eigener Programiersprache
- Ein- und Aus- gabe sind befehlsabhängig objekt- oder text- basierend
- Ein- und Aus- gabe erfolgen in der jeweiligen Codepage
- Textdarstellung erfolgt mittels Konsole die 7Bit-, 8Bit-Codepages und Rastertypes erfordert

Powershell.ISE
- Ist Powershell.exe ohne Konsole
- Die Konsole wird durch eine grafische Benutzer- Oberfläche ersetzt deren textbasierende Ausgabe durch das laufende Betriebssystem limitiert wird.

So, nun wird mir auch einiges klarer und ich hoffe das Ihr Fehler ankreutzt. Nächster Klausurtermin ist morgen abend. Dann werde ich hoffentlich auch den Rest verstehen. Da ich nun etwas belesener bin, wuchtet das Beispiel "DIR" nicht mehr ganz so heftig gegen Microsoft. Denn ich werde auch unter Linuxderivaten auf Probleme stoßen. Gerade das Thai wird technisch noch eine Menge Freude bereiteten. Wie weit ich in meiner Umgebung mit der Konsole komme sehen wir morgen.

Motiviert durch Friemlers Links wollte ich mich schon auf die von mir benötigten Befehle stürzen. Doch bevor ich wieder ein paar Wochen verschieße, stelle ich mal dieses Beispiel in den Raum. Eventuell läßt sich die Frage ja recht einfach beantworten.

Beispiel "DIR"
Offen gestanden bin ich nicht all zu oft im Verzeichnis "Fonts", bis gestern. Dort arbeitet kein Explorer sondern eine Software, für die ich keinen Ausdruck finde. Wenn ich eine Fontdatei (z.B. GNU Unifont) in das Verzeichnis Fonts kopiere verschwindet diese. Ein Überschreiben einer gleichnamigen Datei wird korrekt kommentiert. Doch einen Explorer gibt es anscheinend nicht mehr. Gut das ich eine CMD mit Konsole habe und dies mein eigener Rechner ist.
Anderenfalls würde das Beispiel typischer Weise folgend aussehen.
Ich - Sorry, Projekt nicht lesbar. Hier fehlen die Schriftendateien.
Client - Keine Ahnung, haben die im Büro gestern drauf kopiert. War was in Landessprache.
Ich - Am Clientrechner unten links "cmd.exe" oder wenn gar nichts lesbar eben mit Stick und löse folgenden Befehl in CMD aus "dir %WINDIR%\Fonts".
Da kommen eine Menge Fragezeichen, auch mir. Mittlerweile trifft auch eine E-Mail ein, die zwischen der Entschuldigung und der Aufzählung von schuldigen Umständen auch die Namen der benötigten Dateien enthält. Muss ich für das Kopieren jedes mal ein Skript auf dem Clientrechner schreiben? Die Frage nach der lokaliesierung auf dem Client, darfv nicht der Aufhänger sein.

Anmerkung: Ganz klar. Ich bin und werde auf dem Clientrechner kein Admin. Das Schlimmste momentan: ich habe hier keinen zweiten Rechner mit einem normalem OEM Win7. Es wird voraussichtlich nur mit Powershell_ISE funktionieren. Steht dieser Editor immer zur Verfügung. Die Remotversion funktioniert anscheinend komplett ohne Putty und sonstiges. Doch da brauche ich wohl einen Programierer. face-wink

Die probierte "GNU Unifont" war von dieser Adresse http://unifoundry.com/unifont.html. Morgen also mal mit einer anderen Datei neu.

Bis später
Viewfinder
Viewfinder
Viewfinder 07.01.2013 aktualisiert um 07:04:13 Uhr
Goto Top
Hallo Friemler,
soweit ich die obige Anleitung verstehe ersetze ich die Konsole von PowerShell. Praxis ist immer ein guter Weg zur Erkenntnis. Ich habe mir auch schon einen Helm aufgesetzt. Bevor ich loslege noch ein Paar Zeilen zur Schriftinstallation.
Es gibt offensichtlich gravierende Unterschiede zu Windows- Vorgängern und zum Handling mittels PowerShell oder CMD.
Installation von Schriften.
- Für den als Schriftenverzeichnis "Fonts" gekenzeichneten Ordner gelten die Einstellungen des Explorers nicht
- Am GUI Windows können die betreffenden Dateien (Schriften) wie gewohnt in "Fonts" kopiert werden.
- Nach erfolgreichen Kopieren, wird eine Meldung zur erfolgreichen Installation ausgegeben.
- Exestiert eine gleichnamige Schrift (offensichtlich nicht Dateiname) erfolgt eine Warnmeldung bezüglich "überschreiben".
- Datei mit gleichen Namen werden nicht überschrieben, sondern indiziert (nicht unbedingt sichtbar).
- Eine Identifizierung der Schriftdatei innerhalb der GUI von Windows am Dateinamen ist nur möglich, wenn sich die Schriftdatei keiner Schriftfamilie unterordnet. Optional kann "Schriftardateinamen" angezeigt werden. Man erhält dann den originalen Pfad und den Dateinamen in Grossbuchstaben oder NIX.
Verwaltung Schriftdateien.
- GUI Windows: Schrift-Typ-Dateien die nicht sichtbar sind, können nicht verwaltet werden. Kennt man den Familiennamen, geht es mit Doppelklick weiter.
- PowerShell: zeigt "Fonts" als schreibgeschütztes Systemverzeichnis an
- CMD: zeigt "Fonts" als Verzeichnis an
Schriftnamen verwenden
- In der Registry werden die in der GUI Windows verwendeten Namen ("Name") akzeptiert.

Ich hatte Glück. unifont.ttf "GNU Unifont" ist unter UNIFONT.ttf "unifont Mittel" auffindbar, wird jedoch von der Konsole nicht akzeptiert. So nun ans Werk. Das mir Dein Tip unter CMD nicht hilft habe ich verstanden. Alles andere nach der Bastelstunde.

Grüße
Viewfinder

Fortsetzung:
Meine Parnerin hat mich gerade gefragt was ich denn hier tue. Eine Antwort ist mir nicht eingefallen.

Friiiiiemler!!! Great, Great, Great und keine Ahnung was noch alles. Sorry, das ich so lange auf der Konsole rumgenagelt habe. Ab jetzt muss ich mir nicht bei jedem quer liegendem Zeichen die Frage nach OS und Hardware stellen. Ich hoffe das ich es richtig verstanden habe und dieses "Con"sole nur die Anzeige der Schnittstelle ist, an der ich letztlich auch Eingaben machen kann. Es gibt noch ISE. Leider findet sich nirgends ein Hinweis, das diese Software im gleichen Kontex wie Powershell selbst läuft. Jetzt kann es endlich losgehen, mit den eigentlichen Problemen.
Erst mal das Gute:
- Installation und einrichten von ConEmu ist nicht viel schwieriger als ein Screenshot.
- Ich kann auf allen Ebenen in denen ich arbeite die Sprache verwenden, welche ich zu lernen habe.
- CMD kann weiter verwendet werden (hat jetzt ein neues Kleid).
- Lokal sehe ich für Powershell keine Probleme mehr.
- Ich brauche keine Beispiele zur Problembeschreibung mehr konstruieren.

Was technisch derzeit nicht machbar ist
- Der perfecte Unicode
- Eine Schriftdatei für alles.

Wo es bei mir noch hapert
- Unicode im Zusammenhang Bit-Code-Länge (wie lang?) und Hexadezimalwert (keine tabelle für "basic" gefunden)
- "SetConsoleOutputCP" hilft mir hier bei was weiter?
- Remotanbindung (hier lese ich mich jetzt ein, denn nun lohnt es sich)
- Räder in tiefen Furchen leidlicher Erfahrungen

RIESEN DANKE SCHÖN
Teile Dir doch den Flieger mit rubberman face-wink

PS.: GNU uni hat beim Thai vorerst noch Probleme. Ich forste mal woran es liegt. Konf ist nur ein Schnellschuß face-wink
0dc26088cf4b98c88f01a7ad6dd9ceca
Friemler
Friemler 07.01.2013 aktualisiert um 12:24:18 Uhr
Goto Top
Hallo Viewfinder,

das Verhalten des Explorers im Fonts-Verzeichnis von Windows hält Microsoft wohl für benutzerfreundlicher. User wissen ja sowieso nicht, welche Datei zu einem Font gehört, den sie in einem Dokument nutzen. Wenn's Probleme mit Fonts gibt, müssen eben die IT-Fuzzies ran, dafür kriegen die ihr Geld. face-wink


Btr. Unifont:
Ich ging eigentlich davon aus, dass Unifont der Zeichensatz für alles ist. Es gibt von Microsoft die sog. Font properties extension. Nach Installation dieser Erweiterung hat der Eigenschaften-Dialog von Fonts einige Registerkarten mehr. Auf der Registerkarte Features steht, wie viele Glyphen der jeweilige Font zur Verfügung stellt. Bei Unifont steht dort
GNU Unifont contains 63449 glyphs and no standard kern pairs. This font does not include embedded bitmaps.
Bei Arial Unicode MS steht dort
Arial Unicode MS contains 50377 glyphs and no standard kern pairs. This font does not include embedded bitmaps.

Btr. SetConsoleOutputCP:
Das ist die Windows-Funktion, die ein Programmierer aufrufen muss, um die Codepage eines Windows Console-Objekts zu ändern. Bei der Beschreibung dieser Funktion stehen einige Informationen, die für das Verständnis der Problematik hilfreich sein könnten.


Btr. "Unicode im Zusammenhang Bit-Code-Länge":
Durch Verfahren wie UTF-8 oder UTF-16 ist der Speicherbedarf pro Unicode-Codepoint nicht konstant (UTF-8: 1 bis 4 Byte, UTF-16: 2-4 Byte). Eine ausführliche Erklärung ist ziemlich umfangreich, ich verweise Dich deshalb an Wikipedia:

UCS
Unicode bzw. UCS Transformation Format (UTF)
UTF-8
UTF-16
UTF-32
Liste der Unicodeblöcke

Hier kann man die Komplexität der Thematik erkennen:
Unicode Standard
Unicode Technical Reports


Gruß
Friemler
Viewfinder
Viewfinder 08.01.2013 aktualisiert um 23:18:00 Uhr
Goto Top
Guten Morgen Friemler,
bin heil froh wieder etwas Boden unter den Füßen zu haben.
Wenn's Probleme mit Fonts gibt, müssen eben die IT-Fuzzies ran, dafür kriegen die ihr Geld.
Sofern nach den Lizenzgebühren noch was davon übrig ist.
Ich ging eigentlich davon aus, dass Unifont der Zeichensatz für alles ist.
Ist er auch. Das Thema Font ist in jeder Hinsicht irre komplex. In Westeuropa glauben wir, das die Darstellung der chinesischen Zeichen kompliziert sei. Mit der Anwendung von Unicode ist schon vieles vereinfacht. Leider ist das dokumentieren von Sprache in Schriftform nicht nur eine Frage, der Schreibrichtung. Bei den erwähnten Bildchen sollte man meinen, ein unterschiedlicher Code für jedes Zeichen wäre der richtige Weg. Nach Literaturlage regt sich hier bereits Widerstand seitens der Japaner und Chinesen. Mit Blick auf die Thai-Sprache bin ich etwas aussagekräftiger. Leider noch nicht wirklich im technischen Sinne, da mir nunmehr eher kleinere Dinge fremd sind.
Ich hoffe der kleine Ausflug interessiert. Wenn Du mit Sortierfolgen oder Wortsuche per Skript in Fremdsprachen konfrontiert wirst, ist Nirwana nicht mehr weit.
Beispiel 1
¨โนพรอบเลม¨ meint ¨NoProblem¨ eine importierte Wortgruppe deren Schreibweise festgelegt wurde. Da dieser Umstand bindend ist und sich die Silben des auch einzeln verwendbaren ¨พรอบเลม¨ ¨Problem¨ nicht ändern, Kann man dieses Wort einfach filtern. Einzelne Wörter werden in der hiesigen Schrift nicht getrennt. Für die Bildung von Silben gibt es wiederum Regeln. Wie diese sich technisch auswirken, kann ich noch nicht beurteilen.
Beispiel 2 GNU uni
Dieser Schrifttyp wird für mich zukünftig der erste Weg bleiben, um Funktionalität zu prüfen. Er ist vermutlich der vollständigste Font ohne Lizenzgebühren.
Spezialfall Thai: Thaischrift ist eine recht junge Schriftform. Meine laienhafte Auffassung dazu gehört in kein öffentliches Bord. Die spannende Geschichte zur Schrift ist um vieles interessanter als die ermüdenden Regeln und der Versuch einer korrekten Aussprache. ClickThai bietet den aus meiner Sicht kompetentesten Einstieg in die Schrift.
¨ไม่มี¨ ¨maymie¨ meint das berühmte ¨nohave¨. Wie Du sehen kannst, versagt hier nicht nur ¨GNU uni¨. kannst Du doch nur ¨nicht sehen¨ im Editor-Modus. Die Orientierung der Schrift bezieht sich offensichtlich auf die Konsonanten. Diesen werden die Vokale horizontal und vertikal zugeordnet und bilden somit eine Silbe. ¨m¨ ¨ม¨ Zwei gleich lautende Konsonanten und ¨GNU uni¨ versagt bei ¨may¨ und stellt ¨mie¨ korrekt dar. Endlich habe auch ich mal eine Erklärung, denn ¨may¨ hat ein Problem. Ich könnte auch etwas wie ¨maai¨ schreiben, was meint
¨m¨ ¨ม¨ wie im deutschen
¨aa¨ ¨อา¨ ähnlich einem langem a
¨i¨ ¨อี¨ sehr kurzes i
¨อ¨ ist als Platzhalter zu verstehen
¨มีา¨ Das i befindet sich halbwegs mittig über m und das a in gleicher Dimension hinter m. Da aus vermutlich historischen Gründen ¨ไอ¨ ¨ai¨ verwendet wird, ist ein Benotungszeichen notwendig. Das ¨่¨ ¨mayi eck¨. Hier technisch schon recht gut dargestellt. Dieses Mayieck gehört an die oberste Position, ausgehend vom Konsonanten. Wie man hier die Reservierung ¨oberhalb¨ für den eventuell notwendigen Vokal vornimmt, ist mir noch nicht klar. Doch ich kann optisch die Begründung für das Leerzeichen nach einem Betonungszeichen sehen, wenn ich in ConEmu auf Rasterschrift umstelle. Schon mal über ¨grep¨ oder ¨findstr¨ nachgedacht?
Ich danke für den Ausflug ins Thai. Seit Tagen der erste face-wink.
der Speicherbedarf pro Unicode-Codepoint nicht konstant
Jetzt verstehe ich, warum bei anderen Bit-Codierungen von ¨fest¨ gesprochen wird. Danke für die links, ich werde mich jetzt nach und nach einlesen.

An dieser Stelle ein Sorry an rubberman. Sofern Du noch mit liest, so weit zur Erklärung. In meinem Kontext kann ich an der GUI von Windows an Fremdrechnern mangels Sprachkenntnis nicht arbeiten. Daher das Schleudertrauma in Bezug auf Konsole. Das geplante Konsolentool sollte Probleme in Projektverzeichnissen außerhalb meiner Struktur finden. Deine Nackenfrisur ist sicher face-wink. Das Sorry gilt dem Powershell. Hier weis ich im Moment nicht wirklich, wo es mich unterstützen kann oder ob es als Einstieg zu Programmiersprachen die richtige Wahl ist.


CMD als Einstieg war eine nette Idee. Weiter mit Powershell ist für mich abhängig vom Nutzen. Ich habe neben der offensichtlichen Lücke an Basiswissen ein Motivationsproblem. Meine Problemlösung unterwerfe ich den allgemeinen Gepflogenheiten. Es ist zu liefern. Plattformunabhängig. Wer Probleme mit seiner Netzwerkkonfiguration hat, kann auch gerne einen Stick nutzen.
Bezüglich meiner ersten Schritte in Richtung Programmieren fehlt mir jetzt irgendwie eine motivierende Aufgabe.
Wenn sich eine Aufgabe findet mit der alle glücklich sind, ist mir Powershell gerade recht.
Die Fortschritte sind entsprechend der Informationslage im Internet, vergleichbar mit dem Charakter meiner jetzigen Internetanbindung, zu erwarten.
Wo sehe ich Sinn mit PowerShell?
- Remoteanbindung. PS ermöglicht offensichtlich mit eigenen Mitteln 1:1 Verbindungen auch ohne IIS. Ich habe leider erst in drei Wochen die Möglichkeit, einen Testrechner frei zu machen.
- MySQL. Datenbankanbindungen sollen ein Schwerpunkt unter PowerShell sein. Hier könnte ich mir Arbeitsmittel im Bezug auf das Thai-ABC vorstellen. Extreme Motivation meinerseits, da hier viele Klappen geschlagen werden.
- Freie Aufgabe. Ich habe eine Neigung zu Werkzeugen.

Setzt natürlich voraus das Ihr Zeit und Lust habt. Ausarbeitung und Umsetzung der Ideen, wäre dann mein Job. Ich brauche einfach einen Ersatz für nicht vorhandene Literatur (Internetanbindung wird in einigen Wochen normal) und Mentoren von denen ich schmarotzen kann. Bitte nicht verpflichtet fühlen. Nur wenn wirklich Zeit und Lust übrig sind. Ich kann ja auch schnorcheln gehen face-wink

Dank für die Klasse Hilfe
Viewfinder
rubberman
rubberman 09.01.2013 um 01:07:42 Uhr
Goto Top
Hallo Viewfinder.

An dieser Stelle ein Sorry an rubberman. Sofern Du noch mit liest ...
Kein Grund sich für irgendwas zu entschuldigen face-wink Klar lese ich noch mit. Ich finde das Thema hochgradig interessant.
Leider kann ich im Moment nicht wirklich helfen. Weder mit PowerShell, noch mit .Net bin ich sonderlich gut vertraut. Was Windows angeht, halte ich aber .Net für genial. Somit wärst du IMHO mit PowerShell als Scriptsprache (oder auch C# als compilierbare Programmiersprache) nicht gerade schlecht beraten.
Was das "plattformunabhängig" angeht, bist du damit aber stark an Windows gebunden.

Ich selbst spiele ein wenig mit C und C++ auf Consoleniveau (mangels wirklichem Nutzen für mich, werde ich da den Anfängerstatus auch nicht überschreiten). Eine gewisse masochistische Neigung muss man bei unverwalteten Sprachen wie C auch mitbringen face-big-smile Aber das nur nebenbei.

Ich bleibe auf jeden Fall hier dabei. Falls ich was Sinnvolles beitragen kann, werde ich es tun. Ansonsten als stiller Mitleser.

Grüße
rubberman
Viewfinder
Viewfinder 10.01.2013 um 08:36:18 Uhr
Goto Top
Hallo rubberman,
bin hocherfreut das Du noch dabei bist. Die ersten Probleme sind vom Tisch. Ich kann Windows privat fast uneingeschränkt weiter nutzen. Dank der Konsolenersetzung sehe ich keine Probleme mehr. Bei der zukünftigen IT-Struktur spielt Windows im finanzierbaren Rahmen keine Rolle. Die Einarbeitung in Linux soll hier keine wirkliche Rolle spielen, denn es gibt gute Quellen. Was bleibt ist der Einstieg in das Thema Programmierung.
Käme jemand zu mir, mit dem Wunsch in zwei, drei Jahren Architekt (bin Keiner) zu sein, würde ich die Zeit von Jahren auf Wochen kürzen. Allen Beteiligten bleibt viel erspart. Wird Sein Wunsch jedoch auf einen Teilbereich beschränkt, gibt es gute Aussichten auf Erfolg.
Entsprechend dieses Beispieles möchte ich mich verstanden wissen. Die Bereiche aus Hoch- und Ingenieurbau, soweit ich diese kenne, lassen sich oberflächlich mit monogam umschreiben. Die Datenverwaltung ist extrem eng an das Produktionssystem geknüpft. Das schafft bei den zu oft fehlenden Standards zwischen den Systemen reichlich Probleme. Mittlerweile ist das lebensrettende Thema Dokumentation zwar befriedigend gelöst, aber nur dann, wenn sich alle Beteiligten auf ein entsprechendes System einigen. Genau hier setze ich mit meiner für mich relevanten Idee an. Die Anzahl der allgemein als CMS bezeichneten Systeme ist groß und einige sind sehr flexibel einsetzbar. Mit entsprechender Flexibilität und Konfiguration gewinnt nicht der Anwalt, sondern das Projekt. Die Projekte müssen nicht mehr nach einem technisch vorgeschrieben Schema organisiert werden, sie können mehrsprachig ausgelegt sein UND Lizenzkosten lassen sich entsprechend des Bedarfs kalkulieren. Allen Systemen ist jedoch eines gemeinsam. Sie bedürfen einer guten Planung und Administration. Jetzt sind wir bei mir und eZ-Publish.

Das System beruht hauptsächlich auf PHP, besitzt eine eigene Templatesprache und ist wie üblich Datenbank- basierend. Es lässt sich ohne Programmierkenntnisse verwalten, ist dann aber nicht mehr wirklich flexibel. Genau an diesem Punkt möchte ich mich orientieren. Abgesehen davon, das ich hier für mich ein weiteres Leistungsspektrum sehe.

Wer jetzt noch was zum Thema "ich will programmieren lernen" im Internet sucht, findet nur den Rest face-wink. Der gefundene Kontext ist gleich lautend. "Stelle Dir eine vernünftige, motivierende Aufgabe und arbeite dich daran hoch. Die Frage nach der Sprache ist eher zweitrangig."

Aktuell versuche ich mich gerade an der Normalisierung einer Datenbank auf MySQL. Was am Ende raus kommen soll ist noch nicht ganz klar. ClickThai ist sehr gut organisiert, doch zum Lernen des Alphabets habe ich hier eine bessere Methode kennen gelernt.
- Datenbank mit Formularen für Buchstabe - Bild - Merkwort - Merksatz
- Zeichenunterteilung entsprechend ihrer Funktion
Das ist soweit erst einmal keine große Herausforderung und eventuell auf PHP-Basis auch mit Onlinetuts machbar.
Programmiertechnisch stellt sich jedoch die Frage, wo man die Funktionen definiert (wenn es machbar ist). In der Datenbank oder im Programmcode?

Eine andere Idee ist die Erweiterung dieser Datenbank um so etwas wie eine einfache Rechtschreibprüfung.
- Prüfung auf Anfangs- und End- Silbe
Hier kann es, sofern überhaupt möglich, zu schnell komplex werden, da die Worttrennung in der Thaischrift fehlt.
Einen kleinen Einblick gibt hier der Abschnitt "Varianten" in Thai Industrial Standard 620-2533 hinsichtlich "Escape-Sequenzen". Ein anderes Problem sind die Sonderfälle.

Hoffnungsvoller ist eventuell der Entwurf einer Schnittstelle zum Import von Zeichencodes. Auch unter Linux sieht man keine Dateinamen der Fonts. Bei der Verwaltung der Schriftdateien aus meiner Sicht ein MUSS. Ich denke dabei an beispielsweise folgende Funktionen
- Suche Fonts mit Glyphen aus Sprache "z.B. Thai"
- Suche Fonts mit "Codezeichen" xyz
- Suche Fonts nach Type- Eigenschaften (propurtional, Raster oder Open-Fonts)
- Zeige Codepage nach Sprachraum
Welche Codes neben dem Unicode sind noch wichtig? Welche Angaben sind für Programmierer oder Gestalter wichtig?
Wie kann ich Codepages importieren?

Grundsätzlich stellt sich mir ebenfalls die Frage, wo man Fixpunkte in der Software setzt und wo nicht. Jede Sprache hat ihren EIGENEN Charakter. Alle Sprachen benötigen EIN Schema zur Darstellung auf einem Computer. Wie mache ich Software erweiterungsfähig?

Kurz: Eine effektive Lösung ist das Ergebnis aus Erfahrung, Planung und Ziel weisender Aktion.
Aktion ist aus meiner Sicht das Programmieren. Da gibt es erst einige Fragen nach der Machbarkeit, bevor sich eine motivierende Aufgabe finden lässt. Zuerst geht es in die IT-Wüste.
Zwei Tage nix Computer.

Grüße
Viewfinder
Viewfinder
Viewfinder 13.01.2013 aktualisiert um 11:10:37 Uhr
Goto Top
Guten Morgen allseits,
Mein Talent mitten ins Nichts zu greifen habe ich anscheinend nicht verloren. Das Thema "korrekte Schriftdarstellung" im Kontext internationaler Kommunikation ist etwas komplexer als vermutet und war aus Unkenntnis nicht als Schwerpunkt geplant. Mit Blick auf Unicode wird sich vieles vereinfachen, doch ein einheitlicher Standard der alle Schriften und Sprachen abdeckt scheint mehr ein Wunsch für die Zukunft, als gängige Praxis.
Bei der Verarbeitung von gespeicherten Dokumenten müssen alte Standards wie ASCII berücksichtigt werden. Wie sich hier Programmierer durch fummeln entzieht sich meiner Kenntnis. Je mehr ich mich einlese, um so dichter wird der Wald in dem ich eine Lichtung suche. Die zwei folgenden Links, beschreiben einen Großteil der Probleme aus unterschiedlicher Sicht.
http://let.imperia.org/howto/de/unicode/index.html - mehr an Praxis orientiert
http://czyborra.com/charsets/iso8859.html - Überblick mit verteilten Links
Letzterer Link zeigt meine gemachte Erfahrung in der Rubrick "ISO 8859 Alphabet Soup". Offizielle Codepages sind nicht ohne weiteres downloadbar, da bei ISO je Standard eine nicht unerhebliche Gebühr gefordert wird. Die IANA verwaltet ebenfalls offizielle Standards, doch hier bin ich nicht fündig geworden.
Nun ist es eine Idee, mittels Datenbank etwas Übersicht im Chaos zu schaffen. In diesem Zusammenhang sehe ich folgende Relationen.
- Sprache
- Zeichen
- Codierung (Format)
- Codpage (Codierung - Zeichen)
- Fonttype (Zeichendarstellung)
e7ffac96740a367004cc74252d1c1f84
Die Datenbank soll bei der Auswahl der Codierung und der Schrifttypen helfen. Im vorliegenden Übungsbeispiel "ich lerne Thai" wird die Datenbank erweitert, so das die Beispiele mit verschiedenen Schrifttypen (Stilen) darstellbar sind. Bisher habe ich noch keine Quelle gefunden die bei der Auswahl der richtigen Kombination zwischen Codepage und Fonttype behilflich ist. Sollte sich ein entsprechender Link finden, entfällt dieser Teil der Datenbank, da Aufwand und Nutzen dann in keinem Verhältnis stehen.
Die Arbeitssprache der Datenbank ist englisch und die jeweilige Übersetzung wird vom auslesendem System übernommen. Geplant ist derzeit PHP und weiter blicken ein PHP-basierendes CMS.

Language
"Language" steht in Relation zu ihrem Einsatzgebiet "Nations-Regions" welches eine Beziehung zur Sprache in der Ralation entsprechend der Verwendung "LanguageCharacter" hat.
Beispiel:
German/ger - Germany - administrative language - 0
German/ger - Germany - regional language - 0
German/ger - Austria - administrative language - 0
German/ger - Austria - regional language - 0
Malay/msa - Malaysia - administrative language - 0
Malay/msa - Malaysia - regional language - 0
English/bre - Malaysia - administrative language - 1
Esperanto/epo - International - art language - 0

Signs
"Signs" besitzt eine polare Stellung. Als Zeichen sehe ich hier die Möglichkeit, das Zeichen als Grafik aus dem Unicode selbst zu entnehmen oder auch bei neuen Schriften selbst zu definieren. Es handelt sich also um eine Datei mit grafischen Inhalt.

Codepages
"Codepage" ist aus meiner Sicht der Dreh- und Angel- Punkt. Unter Anderem gibt es ein Normalisierungsproblem.
ASCII-Formate -> ein Code verschiedene Zeichen
Uni-Formate -> ein Zeichen verschiedene Codes
Besteht dieses Problem bei mir aus fehlendem Wissen oder es ist real? Zum Thema ASCII hat Friemler bereits eine gute Darstellung des Problems beigesteuert. Da ein Hexadezimalcode oder eine Dezimalzahl mittels ASCII-Codepage mehere Zeichen darstellen kann, ist dieser Fakt mein Ausgangspunkt. Für Unicodes bedeutet diese Betrachtung immer eine 1-1 Beziehung. Hier wird dann natürlich eine Menge Balast mitgeschleift (vermutlich sinnlos). Kurz: Ich brauche hier Hilfe und gebe die Tabellen nur zur Beschreibung wieder.
Bechreibung:

CodeCharacter - ASCII / Local codepage as hexadecimal
CodeCharacter - UTF-8 / Unicode ...
CodeCharacter - UTF-16 / Unicode ...
CodeCharacter - C-Oktal terminiertes UTF-8 / Unicode ...
CodeCharacter - Dezimale XML-Entität / Unicode ...??

Codes - a hexadecimalcode
Es bleibt mit meinem Kenntnisstand offen, wie Sinn bringend beispielsweise dezimale Codierungen sind, oder ob sich weitere Codierungen mittels Datenbank berechnen lassen.

Codepage - 874 / Version / Datum
Codepage - 850 / Version / Datum
Codepage - CP1252 / Version / Datum
Codepage - UTF-8 / 1.1 / Datum
Neben der mir noch fehlenden Struktur wird hier die Redundanz im Unicodebereich deutlich. Einen ordentlichen Weg sehe ich im Moment nicht. Gut wäre hier sicherlich die Orientierung der Namen nach ISO. Leider wird es für die vielen Codepages nicht zwangsläufig einen ISO-Standard geben.

AliasName_CP - Windows 1252
AliasName_CP - Alternativer Name der Codepage
Es ist natürlich ebenfalls möglich die Alias-Namen unter Codepage zu führen.

Provider
Provider - Windows 7
Provider - Windows 7, Powershell
Provider - HTML 4
Provider - Java
Es sind also die unterstützenden Systeme gemeint.

Fonttype
Fonttype - Schriftfamilie
Hier muss ich mich erst noch einlesen. Natürlich sind die verschiedenen Schrifttypen gemeint. Unterschieden soll nach den geometrischen Eigenschaften (Raster, Vektor), nach der Codierung mit der die entsprechende Schrift angesprochen werden kann und nach den Lizenzen unter der die Schrift veröffentlicht ist.

Weder Provider noch Fronttype sind ausgearbeitet, da ich hier noch zu viele Lücken habe.
Den Entwurf habe ich mit Workbench gemacht. Hoffentlich verliere ich, mit der Doku zu diesem Programm, das Gefühl unter Windows 95 zu arbeiten. Dank "Klick-Klick" lässt sich auch einfach alles umschmeißen.
Bis ich in den oben genannten Punkten einen Überblick habe, mache ich mit dem Thai- Alphabet weiter. Das scheint doch das billigere Thema zu sein face-wink.

Grüße
Viewfinder
rubberman
rubberman 14.01.2013 aktualisiert um 01:56:25 Uhr
Goto Top
Hallo Viewfinder,

beschränke dich doch auf das, mit dem du real zu tun haben wirst.
Wenn ich es richtig verstanden habe ist das 874, 1252 und Unicode.
Die 850 kannst du eigentlich außen vor lassen, da du kaum Daten vorliegen haben wirst, die so codiert sind. Alle anderen Zeichensätze sind doch im Grunde irrelevant für dich (und falls sie doch benötigt werden, kannst du sie nachträglich implementieren).
Das MSDN hilft dir bspw. bei der Übersetzung der Codepage zu Unicode. Das als Übersetzungstabelle in eine Datenbank zu hämmern (falls notwendig) ist einmal Fleißarbeit.
Interessanter wäre für mich immer noch die Frage, woher du eigentlich weißt, welches Charset du für die jeweils eingehenden Daten heranziehen musst. Woher kommt diese Information? Für Dateien die in einem Single Byte Zeichensatz erstellt wurden, finden sich keinerlei Hinweise in der Datei selbst, wie der Dateiinhalt dargestellt werden soll. Hast du diese Information einmal, kannst du sie natürlich, wie von dir vorgesehen, mit in die Datenbank packen.
Und was den Font angeht, so benötigst du letztlich auch nur einen Unicodefont, der auch Thai möglichst vollständig darstellen kann. Sollte sich doch hoffentlich finden lassen (genauer gesagt musst du den bereits vorliegen haben, nämlich auf den Thai Maschinen).

Grüße
rubberman
Viewfinder
Viewfinder 15.01.2013 um 09:19:03 Uhr
Goto Top
Hallo rubberman,
beschränke dich doch auf das, mit dem du real zu tun haben wirst.
Ich mache mal eine Liste der privaten Kandidaten für das in Ferne liegende Testsystem auf. Die Liste können wir gleich wieder vergessen, da es im Moment eher darum geht kommende Probleme zu finden und mir das entsprechende Wissen zur Lösung anzueignen. Unter ¨Single Byte Zeichensatz¨ verstehe ich bislang 7- und 8- Bit Codierungen. Also ASCII. Dementsprechend habe ich die Liste danach ausgerichtet.
China - Transliterationen
Deutschland - 1250
Japan - Transliterationen
Kirgistan - 1251 mit geringer Wahrscheinlichkeit 1256
Thailand - 874

Es reicht Thai als Schwerpunkt. Ich werde mir eine Aufgabe einfallen lassen, bei der ich Beispieltexte importieren und mit verschiedenen Schrifttypen darstellen kann. Das dürfte bei meinem aktuellen Horizont mehr als ausreichend sein. Absehbare Probleme sind dann meiner Meinung nach testbar. Die Fonts als solches sind kein Problem. Leider bietet keiner der Fontmanager die Funktion nach Fonts in gewünschter Sprache zu suchen. Das Internet ist hier komfortabler. Es war nur eine Idee face-wink.

Soweit ich die Problematik ¨Darstellung, Wiedergabe von Zeichen¨ verstanden habe, ist die Darstellung auf Systemen mit Unicode technisch lösbar. Dieser Umstand (wenn richtig verstanden) reicht mir vorerst als globale Aussage. Soweit es sich um Zeichen handelt, die am System eingegeben werden, sind diese 1:1 reproduzierbar oder ein systembedingtes Problem.

Da die geplante Funktion allgemein als Archivierung von Abläufen definiert werden muss, ist die Speicherung von bestehenden Daten ein wichtiger Schwerpunkt. Hier unterscheide ich in zwei Schwerpunkte.
Datei gebundene Daten:
Hierbei handelt es sich um Dateien die per Upload zum Downloaden bereit gestellt werden. Lediglich das Handling der Links geht über eine Datenbank. Hier sehe ich vorerst keine Probleme. Die Kompatibilität der Daten muss auf der Seite des Client gewährleistet sein.
Visualisierte Daten
Hier sehe ich Daten die vom System reproduziert und auf der Seite des Client (Browser) abgebildet werden. Es gibt Dinge die funktionieren oder eben nicht. Daher eben die Wahl von eZ. Bei der Darstellung von Text, kann ich mir diese Einstellung nicht leisten. Spezialbereiche wie ¨GIS¨ oder ¨CAD¨ sollen hierbei erst einmal nicht betrachtet werden. Gut, wenn ich nicht alleine sterben muss.
Interessanter wäre für mich immer noch die Frage, woher du eigentlich weißt, welches Charset du für die jeweils eingehenden Daten heranziehen musst. Woher kommt diese Information? Für Dateien die in einem Single Byte Zeichensatz erstellt wurden, finden sich keinerlei Hinweise in der Datei selbst, wie der Dateiinhalt dargestellt werden soll.
Offen gestanden, ich kann es nicht wissen. Es sei denn ich definiere Standards. Für bestehende Dokumente fehlt mir bislang das tiefere Verständnis zur Materie. Vermutlich muss ich etwas basteln und den Lieferanten zur Eingabe der entsprechenden Information zwingen. Neu und noch unverstanden ist der Hinweis ¨Übersetzungstabelle¨ im Zusammenhang Datenbank. Sorry, falls die kommende Frage alles bisherige ignoriert. Kann man mit Hilfe einer Datenbank ASCII-Dokumente zur Anzeige in Unicode übersetzen?
Aktuell kann man nur das Open-Document-Format (odf) direkt importieren. Die Beiträge, Publikationen oder eben einfach textliche Inhalte lassen sich offline mittels eines Office erstellen, das dieses Format unterstützt. Für Grafikdateien stehen Module zur Verfügung.

Zusammengefasst ergeben sich aus meiner Sicht daher verschiedene Wege, um bestehende Textdateien aus Sicht des Lieferanten abzubilden.
1. Copy & Paste: Altes Dokument öffnen und im Editor des Systems (UTF-8) einfügen.
2. Textdatei mit entsprechender Information zum Format hoch laden und zu UTF-8 übersetzen lassen. Die Anzeige erfolgt als reiner Text. Eine Massenverarbeitung bestehender Archive wäre dann auch für Laien möglich.
3. Die doch schon immer gequälte PDF-Schiene fahren. Als Entschädigung für den Mehraufwand würde ich dann eine Erleichterung bei der Katalogisierung und eine Volumensperre anbieten.

Lösung 3 bitte nicht zu ernst nehmen. Wenn Dokumente aus Text und Grafik bestehen, sehe ich ohne Standard (hier odf) ohne hin keinen anderen Weg.

Sorry für die Menge Text. Ich bin froh, das ich langsam eine Richtung sehe. Nachstehendes ist nur Kontext.

Grüße
Viewfinder

Nur mal eben schnell eine Liste der Standarts kopiert. Ist also das Arbeitspensum der nächsten Jahre.
XHTML, XML, PHP, SQL, LDAP, RSS, SOAP, UNICODE, UTF-8, ISO 8859-1, PDF, WebDAV
- XHTML, XML: Standardformate für Dokumente. CSS dient hier auf der Ausgabeseite zur Formatierung. Die Einbindung von JavaSkript ist mit Hilfe einer Erweiterung ¨eZ JScore¨ möglich. Der Direktimport wird im Dateiformat ¨odf¨ gehandhabt.
- PHP, SQL: In SQL buddle ich mich gerade ein. Vorerst mit GUI. PHP ist die Basis des Systems und muss noch etwas warten, bis ich etwas Land in MySQL gewonnen habe.
- UNICODE, UTF-8, ISO 8859-1: Soweit ich es mittlerweile einschätzen kann, sind hier die charsets der Ausgabe (template) gemeint. ISO 8859-1 scheidet bereits beim Thai aus.
- LDAP: Wie weit mich dieses Thema bei den Internas von eZ betrifft, kann ich noch nicht sagen. Bezüglich der Anbindung von lokalen Netzen, lasse ich besser die Hände in den Taschen. Stichwort Benutzerverwaltung.
- SOAP: Auf Grund fehlender Erfahrung kann ich hier keine Vermutung zu unterstützen Codierungen treffen.
- RSS: wird mich bei XML treffen
- WebDAV: funktioniert gut, kann ich aber vernachlässigen, da es durch ein Modul ¨MultiUpload¨ allmählich ersetzt wird. Für Grafikdateien selbst mit Editor kein Problem. Im Zusammenhang mit Textdateien habe ich nichts gefunden. (Lösungsweg 2)
- PDF: Kenne ich nur als Ausgabeformat. Ich weis nicht ob dieses Format über eine Datenbank laufen kann.
rubberman
rubberman 15.01.2013 um 23:15:29 Uhr
Goto Top
Hallo Viewfinder.

Neu und noch unverstanden ist der Hinweis ¨Übersetzungstabelle¨ im Zusammenhang Datenbank. Sorry, falls die kommende Frage alles bisherige ignoriert. Kann man mit Hilfe einer Datenbank ASCII-Dokumente zur Anzeige in Unicode übersetzen?

Auf die Frage, ob die Datenbank das kann, habe ich keine Antwort. Wird wohl auf die Software/Frontend ankommen. Lediglich die Zuordnung ASCII Codepage zu Unicode kannst du in einer Datenbanktabelle darstellen und für eine Übersetzung heranziehen.

Wenn ich diesen Artikel richtig verstehe, kann auch die Formatierung in einer Datenbanktabelle dazu beitragen, einen Text gleich im UTF-8 Format zu speichern. Da wäre aber wieder die Frage, welche Codepage angezogen wird, um die Daten zu konvertieren.

Andere Möglichkeit wäre noch irgend ein Tool dazwischen zu schalten, das die MultiByteToWideChar funktion nutzt. Aber auch diese möchte mit der entsprechenden Codepage gefüttert werden.

Die letzten beiden Varianten werden wohl bedingen, dass die entsprechenden Codepages auch installiert wurden. Darum war mein Gedanke die Codepages als Datenbanktabellen zu hinterlegen. Textdaten könnten dann byteweise gelesen und konvertiert werden. Wie sinnvoll das ist, hängt davon ab wie die programmatische Umsetzung der Konvertierung aussehen muss.

Grüße
rubberman
Viewfinder
Viewfinder 16.01.2013 um 08:08:35 Uhr
Goto Top
Guten Morgen rubberman,
ein schöner Tag und riesigen Dank für Deine Geduld. Es kommt Licht am Horizont. Mit meinem langsam wachsendem Verständnis und Deinen letzten Hinweisen, habe ich mich umgesehen. Eine rein Serverseitige Lösung gibt es vermutlich nicht. Bei eZ bleibt es bei odf, cvs oder eben xml. Alle von mir gefundene Versuche haben eines gemeinsam. Die Konvertierung der Daten vor dem Speichern in die Datenbank.
Transformation ASCII zu Unicode
- Es gibt einige Tools.
AutoUniConv
Setzt durch C aus meiner Sicht einen eigenen Server voraus und die Lizenzbedingungen sind für meinen Kontext ungeeignet.
CONVERT geht den Weg über Dateiformate. Schon mal nicht schlecht. Lizenzbedingungen sind gut gemeißelt, wenn auch etwas happig für meinen Plan.
online 1 online 2 online 3 basieren auf ISO-8859-1. Für mich mittlerweile verständlich, dürfte auch nicht weiterführen.

Alle Lösungen decken den benötigten Bedarf nur teilweise ab. Es bleibt anscheinend nur der Weg über den Client. Dieser hat die Dateien in einem standardisierten Format zu liefern. Was das heißt, kann man sich gut ausmalen face-wink. Dazu brauche ich nicht mal einen Worstcase, wie Maschinen in olivgrün oder humanistische Industrieschrottspenden.

Doch wir haben einen Teilerfolg. Ich glaube die jetzige Aufgabenstellung MySQL und Datenimport ist ein sehr guter Anfang. Für mich privat bekomme ich alles geregelt. In Vorbereitung auf einen kommerziellen Einsatz, sehe ich vorerst nur zwei Möglichkeiten.
1. Editor-Konverter in Verbindung mit einem Skript. Die Dateien werden zu odf oder wenn möglich zu xml kovertiert. Hier habe ich noch nichts gefunden, das ich von der Konsole aus ansprechen kann.
2. Mörderisch langes und oft zu übersetzendes Tutorial, wie man mittels OpenOffice ODF-Dokumente erstellt.

Die letzten beiden Varianten werden wohl bedingen, dass die entsprechenden Codepages auch installiert wurden. Darum war mein Gedanke die Codepages als Datenbanktabellen zu hinterlegen. Textdaten könnten dann byteweise gelesen und konvertiert werden. Wie sinnvoll das ist, hängt davon ab wie die programmatische Umsetzung der Konvertierung aussehen muss.

Ein super Einfall den ich gerne noch nachgehen würde. Dann hätten wir unser Übersetzung und ich sehr viele Probleme weniger. Es gibt hier wenigstens momentan einige Probleme.
1. Mein Kenntnisstand. Ich fange gerade erst mit MySQL an.
2. Weiße Wüste. Ist nur geschätzt, da ich nichts gefunden habe, das Richtung "Konvertierung innerhalb der Datenbank" geht.
3. Codepage. Immer wenn ich mit zusätzlich Daten in Berührung kam, gab es die Maschinen auf denen diese erstellt worden nicht mehr oder es wurde ein anderes Softwaresystem benutzt. Textdaten ließen sich in der Regel mit den gängigen Editoren wiederherstellen. Textformatierungen gehen hierbei verloren. Da es nur um die den eigentlichen Inhalt geht, ist das akzeptabel. Leider lässt sich das nicht für alle Sprachen sagen. Im Thai reicht ein Leerzeichen als Satzende. Das Leerzeichen ist jedoch nicht zwangsläufig ein Satzende. Wie zielsicher der Zeilenumbruch identifiziert werden kann entzieht sich meiner Kenntnis. Solange wie die Sprache feststeht, lassen sich eventuell Muster vergleichen. In den nächsten Tage werde ich ein paar Dateien in ASCII mit unterschiedlichen Codpage erzeugen. Mal schauen was meine Editoren daraus machen.

Grüße
Falkmar
rubberman
rubberman 16.01.2013 aktualisiert um 23:48:36 Uhr
Goto Top
Hallo Falkmar.

2. Mörderisch langes und oft zu übersetzendes Tutorial, wie man mittels OpenOffice ODF-Dokumente erstellt.
OpenOffice lässt sich scripten (wenn auch nicht besonders gut). Ich hatte hier mal an einem solchen Script mitgearbeitet. Wie du siehst ist es kein Problem ein VBS mit Argumenten aus der Kommandozeile zu füttern.
Ich frage mich allerdings, meinst du wirklich Dateien mit Endung .odf? Diese sind bei mir mit OOo Math verknüpft.

oder wenn möglich zu xml kovertiert
Dazu müsstest du allerdings etwas zur Struktur der Dateien preisgeben. Man kann auch den gesamten Inhalt einer Textdatei in einen <![CDATA[ ... ]]> Kommentarblock packen. Ich glaube aber kaum dass du dir das so vorstellst.

Grüße
Steffen
Viewfinder
Viewfinder 17.01.2013 um 07:39:45 Uhr
Goto Top
Guten Morgen Steffen,
ups, habe ich gar nicht mitbekommen. Ich bin ohnehin kein Verfechter anonymer Kommunikation. Der Striptease geht auch gleich weiter.
Ich frage mich allerdings, meinst du wirklich Dateien mit Endung .odf?
Mein Kenntnisstand (IT) lag bis zur Eröffnung dieses Posts bei Anfang 2009 Windowsanwender (XP). Allein das Zusammenbasteln meiner neuen Maschine hat gezeigt, was schmerzlos in den letzten Jahren an mir vorbei gelaufen ist.
Ihr habt hervorragende Aufräum- und Weiterbildungs- arbeit geleistet. Begriffe und Standards sitzen noch nicht richtig. Soweit zur Entschuldigung.

¨ODF¨ = Open Document Format. Soweit ich mich bisher eingelesen habe, kann man es wohl auch als XML-basierendes-Format bezeichnen. XML ist ebenfalls der Ausgabestandard des von mir für den zukünftigen Einsatz geplanten Systems.

Und jetzt noch den letzten Fetzen. Der so nicht geplante jedoch für mich erfreuliche Verlauf der kurvenreichen Diskussion hat folgenden Hintergrund.
Datenhaltung (speichern, sichern) sehe ich nicht als als Thema. Die von mir durchlebten Worstcase sind technisch nur in Verbindung mit ihrer Verfügbarkeit eingrenzbar.
Datenverwaltung (organisieren, abrufen) ist offenbar ein Thema das mit der derzeitigen Entwicklung (Mobile Geräte und Bedienungsoberflächen) eine neue Qualität erfahren wird. Das von mir gewählte System berücksichtigt aktuelle Trends, durch seine Entwickler.
Visualisierung (Plattform übergreifend) betrachte ich unabhängig von der Bearbeitung der Daten. Es geht mir hierbei nur um die Darstellung der Daten. Tasten, fühlen setze ich mal hinten an und riechen verweigere ich mangels persönlichen Bedarfs.
Verfügbarkeit (Plattform übergreifend) ist, solange das Internet nicht privatisiert oder lizenziert wird, ein zunehmend schwindendes Problem. Geringe Bandbreite außerhalb des lokalen Lans nehme ich in Kauf.

Nicht nur in der Hoffnung auf eine Wiederholung der letzten Jahre plane ich eine neue privat genutzte IT-Struktur mit den Schwerpunkten Verfügbarkeit und Visualisierung. In dieser Hinsicht habt Ihr alle Probleme vom Tisch gefegt. Die technischen Probleme sind kalkulierbar. Ich habe zwei Jahre Lehrzeit. Ab dann darf ich mich sesshaft bezeichnen und werde einer geregelten Tätigkeit nachgehen, die sich wesentlich vom Unkraut zupfen unterscheidet.

Die vergangene Kurvenfahrt diente der technischen Abgrenzung meiner Ideen. Falls Interesse mache ich gerne ein Beispiel aus meiner vergangenen Tätigkeit. Es scheint machbar. Was Zahnschmerzen bereitet, ist die Verarbeitung von Textdokumenten. Hier muss ich (auch zur Abgrenzung anderer Marktbeteiligter) die Clientseite entlasten.

OpenOffice lässt sich scripten (wenn auch nicht besonders gut)
Das ist schon mal eine super Information. Ich habe Deinen Link überflogen. Gut das ich noch nicht gefrühstückt habe. Ich gehe einfach davon aus, das die Linuxkonsole und Powerschell in irgendeiner Form gleiches Potential wie VBS haben. Wie schon geschrieben, werde ich verschiedene Dokumente anfertigen und schauen wie bw. OpenOffice und LibreOffice darauf reagieren. Sorry wenn es an der Stelle nicht so zügig vorangeht. Wir ziehen am 21.ten um. Das bringt die Nahrungsaufnahme etwas durcheinander.

Die Textdateien werde ich in verschiedenen Formaten unter Notepad++ (Windows) und gedit (Linux) erzeugen. Ich hoffe das ich dadurch versteckte Metainformationen zur verwendeten Codepage (ASCII) vermeiden kann.

Alles was ich bisher zum Dateiimport zur Datenbank gefunden habe, bezieht sich auf CSV.
Dateiimport MySQL
Wie ez die Geschichte mit den OpenOfficeDokumenten löst, schaue ich nach dem 21.ten. Ich brauche die Onlinedokumentation. Heutige Ladezedeit 10 sec bis 3 min.

Man kann auch den gesamten Inhalt einer Textdatei in einen <![CDATA[ ... ]]> Kommentarblock packen.
Ich vermute ja. Es geht weniger um die originalgetreue und weiter verarbeitbare Darstellung. Das ist im Moment mehr Wunsch als Realität. Soweit mein Horizont reicht, würde ich sagen. Den Text soll aus der Datei (vorzugsweise per Seite) in eine Zelle der Datenbank gespeichert werden. Die Ausgabe ist dann das Problem der Anwendung. Hier PHP.

vielen Dank
Falkmar
rubberman
rubberman 17.01.2013 um 20:52:04 Uhr
Goto Top
Hallo Falkmar.

¨ODF¨ = Open Document Format.
Haha, das dachte ich mir schon. OK, in dem Fall wird das vermutlich ein ODF Dokument mit Endung .odt ...

Alles was ich bisher zum Dateiimport zur Datenbank gefunden habe, bezieht sich auf CSV.
Naja, ein bisschen mehr lässt sich da schon finden.
dev.mysql.com/doc/refman/5.6/en/sql-syntax-data-manipulation.html

Man kann auch den gesamten Inhalt einer Textdatei in einen <![CDATA[ ... ]]> Kommentarblock packen.
Ich vermute ja.
Ich nicht. Denn dann kannst du dir den Schnickschnack sparen und es gleich bei Plaintext lassen face-wink

Grüße
Steffen
Viewfinder
Viewfinder 18.01.2013 aktualisiert um 09:37:14 Uhr
Goto Top
Hallo Steffen,
in voller Verzweiflung habe ich jetzt die Tests amateurmäßig durchgezogen. Das Ergebnis ist schlichtweg deprimierend. Ich hänge die Aufzeichnung unter an.

Danke für den Link. Das ist die Hilfe die ich brauche, da ich im Moment nicht weis, wo nach ich suchen muss. Es wird ein paar Tage brauchen. Bitte nicht mit Desinteresse verwechseln (Umzug auf Thai).

Ich nicht. Denn dann kannst du dir den Schnickschnack sparen und es gleich bei Plaintext lassen.
Sch... manchmal fehlen mir die Worte. Wenn "Plaintext" das neue Zauberwort ist, komme ich damit mindestens für die Planung weiter. Angesichts der massiven Probleme ist es für deutsch und englisch ausreichend. Leider sehe ich noch nicht die Konsequenzen von Plaintext (in der 1:1 Übersetzung) in anderen Sprachen.

Ich bin unglücklicherweise kein Nachrichtentechniker der aus einer einstelligen Null fünf Versionen zieht. In einer Stunde fängt hier der Rummel an, deshalb jetzt schnell noch die Zusammenfassung des Experiments. Sieht eher böse aus. Keine Ahnung ob ich mich bei dem Problem jetzt auf PHP, SQL oder den Apachen konzentrieren muss. Soweit ich es überblicke, bringt nichts davon eine Codepage mit.

bis später
Falkmar

___________

Systemvoreinstellungen
Windows 7:
- Installierte Sprache = deutsch
- Standartformat = deutsch
- Aufenthaltsort = deutsch
- Standarteigabe = Englisch (USA) - Englisch (USA, International)
Linux:
- Installationssprache = Englisch
- Standartsprache User = Deutsch
- Zusätzliche Sprache = Thai
- Standardkeyboard = us/altgr-intl

Eingabeprobleme:
- Linux gedit, Eingabe offensichtlich Unicode, Speicherung erfolgt in der gewünschten Codierung
- Windows Notpad++, Eingabe und Speicherung kann in der gewünschten Codierung erfolgen, wenn Windows die Tastatur nicht automatisch umstellt.
- InputDevice = Ami/Thai Keyboard "DeLUX K1000"
ISO 8859-6 Arabisch:
- Linux, Eingabe möglich, speichern nur mit Unicode. Somit unbrauchbar für das Experiment.

1. Ziel des Experimentes
Folgende Fragestellung ist maßgeblich. Sind Textdateien mit Einbyt-Codierung ohne Kenntnis der zur Erstellung verwendeten Codepage und ohne Verwendung des originalen Betriebssytemes wiederherstellbar?

2. Anlegen der Dateien
Die Dateien wurden mit Notepad++ unter Windows 7 und mit gedit unter Linux Ubuntu 12.04. erzeugt. Alle Dateien wurden bewußt ohne Dateiendung gespeichert. In den zugänglichen Metadaten des jeweiligen Systems sind keine Hinweise auf die verwendete Codepage enthalten.

3. Eingabe der Daten
Zur Eingabe der Daten wurde mit Ausnahme des Zusatz "(ä, ü, ö, ß)" in deutscher Sprache ein einheitlichen Chema der Tastatur verwendet. Das hochtrabenden Schema besteht nach lateinischen Bezeichnungen aus "Das ist ein Test.".

4. Speicherung der Daten
Die Speicherung der Dateien erfolgte auf einem seperaten mit NTFS formatierten Datenträger. Dieser Datenträger ist in Windows 7 automatisch eingebunden und muss unter Linux gemountet werden. Es wurde wenn möglich eine Version je Codepage und Betriebssystem als Datei gespeichert.
Metadaten Windows (Explorer)
- codiert durch = nix
- Dateibeschreibung = nix
- Dateiversion = nix
- Typ = Datei
- Art = nix
- Land/Region = nix
- Zusammenfassung = nix
Alle Dateien werden durch gleiche Metadaten beschrieben
Metadaten Linux (Gnome Commander)
Sorry bin vollkommen neu in Linux. Einziger Anhaltspunkt für mich ist
Format = applikation/octet-stream
Alle Dateien werden durch gleiche Metadaten beschrieben

5. Verwendete Codepages
Die Verwendung einer Codepage ist abhängig von ihrer Existenz im Betriebssystem und der Unterstützung des jeweiligen Editors. Hier gibt es Unterschiede zwischen Linux und Windows. Folgende Codepages wurden je OS verwendet.
Linux: IBM 850 für deutsch; Windows 1250 für deutsch; ISO 8859-7 für griechisch; ISO 8859-5 für russisch; TIS 620 für Thai
Windows: ISO 8859-6 für arabisch; OEM 850 für deutsch; Windows 1250 für deutsch; ISO 8859-7 für griechisch; ISO 8859-5 für russisch; TIS 620 für Thai

6. Ergebnis
6.1 Windows
- Notepad: keine Datei wird ordnungsgemäß wiedergegeben, Fallback vermutlich TIS 620
- Notepad++: Windows 1250 beiden Versionen korrekt, Fallback nicht erkennbar
- Windows Write: keine Datei wird ordnungsgemäß wiedergegeben, Fallback vermutlich Michung aus TIS 620 und Unicode
- WordPad: keine Datei wird ordnungsgemäß wiedergegeben, Fallback vermutlich Michung aus TIS 620 und Unicode
- OpenOffice: erfordert Eingabe der Codepage, IBM 850 durch "Westeuropa (DOS/OS2-850/International)" ersetzbar
- Nebenefekte: Nach Installation der neuen Tatstaturbelegungen und testbedingtem Neustart verzichten Systemmeldungen zugunsten von Fragezeichen auf Umlaute.
6.2 Linux
- gedit: alle eigenen Versionen und beide Windows 1250 korrekt (kein ISO 8859-6), Fallback nicht erkennbar
- LibreOffice: reagiert wie OpenOffice unter Windows
- Nebeneffekt: Es lassen sich maximal vier Tastaturtbelegungen installieren. Metadaten mit Bezug auf genutzte Codepage nicht gefunden.
Viewfinder
Viewfinder 18.01.2013 um 09:55:49 Uhr
Goto Top
Man bin ich langsam. Die Ausgabe läuft über einen Browser. Doch bevor ich mich jetzt in wilde Theorien stürze, bleibt immer noch das Problem, Textzeichen zu Unicode wandeln. Hat der Client dann ein Darstellungsproblem, braucht er ein Betriebssystem face-wink.
Viewfinder
Viewfinder 19.01.2013 um 07:27:06 Uhr
Goto Top
Hallo Steffen,
bevor ich meine Kiste morgen abschalten muss, kann ich Dank Deines Links doch noch etwas Konstruktives beitragen.

Das Freudige zuerst:
Dein Link sieht aus wie ein Volltreffer. Offensichtlich kann ich jeder Art von Datei in einer Datenbank speichern.
LOAD DATA INFILE
The character set indicated by the character_set_database system variable is used to interpret the information in the file. SET NAMES and the setting of character_set_client do not affect interpretation of input. If the contents of the input file use a character set that differs from the default, it is usually preferable to specify the character set of the file by using the CHARACTER SET clause. A character set of binary specifies “no conversion.”
Nach dem 21.ten werde ich den neuen direkten Draht zum Internet nutzen und mir ein paar Skripte rauben. Die GUI von Workbench bringt mich ohne Kenntnisse der Sprachkultur von SQL nicht wirklich weiter.
Kann ich obiges Zitat wie folgt interpretieren?
1. Dateien können unabhängig von der Standard-Codierung der Datenbank gespeichert werden.
2. Für vom Standard abweichende Codierungen empfiehlt sich die Klausel "CHARACTER SET". Diese Klausel hat nur informativen Charakter(keinen Effekt auf Ein- Ausgabe).
3. Eine Speicherung im binären Format ist möglich. Es erfolgt keine Konvertierung.
Sicherlich eine etwas primitive Frage. Das Englisch der Doku ist verständlich. Leider ist der "Überblick für Dummys" mehr dem Buchhandel vorbehalten.


Zum Experiment:
Das Windows versucht nicht decodierbare Zeichen mittels Unicode zu ersetzt, habe ich erwartet. Warum jedoch jedoch vorrangig Thai-Zeichen ermittelt werden, ist mir nicht klar. Ich hätte hier eher Fragezeichen erwartet.
Encoding.ASCII-Eigenschaft von Microsoft
Das Gleiche nochmal für Leute wie mich
Von den Skripten verstehe ich nichts. Aber auch hier lautet der allgemeine Kontext "Decodierung von 7 bzw. 8 Bit-Codierungen ohne Codepage nicht möglich". Ich schreibe diesbezüglich an anderer Stelle noch etwas.

Das Ubuntu hat zwar besser gepunktet, aber nur bei den selbst erstellten Dateien. Daher gehe ich davon aus, das es versteckte Matadaten gibt. Wollte ich meine auf Comodore erstellte Formelsammlung sichtbar machen, geht dieses nicht ohne manuelle Eingabe der ursprünglich verwendeten Codepage. Keine Angst, C128D und Datei existieren nicht mehr.

Zusammenfassung:
Eine auf Standards beruhende Lösung ist für mich nicht sichtbar. Ich lasse mich natürlich gerne eines Besseren belehren. Diesbezüglich habe ich mich nach grundsätzlichen Vorgehensweisen zur Decodierung von Zeichen in Bezug auf Sprache umgeschaut. Allen scheint eines gemeinsam. Sie benutzen Vergleichsmuster. Technisch ist dieser Weg theoretisch möglich. Hier wäre jedoch eine Datenbank notwendig die mindestens alle in Frage kommenden Codepages und spezielle Muster zur jeweiligen Sprache enthält. Eine Erstellung der Datenbank steht aus meiner Sicht in keinem vertretbaren Aufwand/Nutzen- Verhältnis. Zum Leidwesen meiner Umwelt wurde ich mit Helm geboren. Doch diese Wand hau ich nicht um. Sorry, wenn ich hier nach soviel Arbeit aufgebe.

Fazit:
Die geplante Funktion "Einfache Darstellung von Textdateien" benötigt zwingend wenigstens für 7- und 8-Bit-Codierungen eine aktive Mitarbeit der Clientseite. libreOffice und OpenOffice turnen einen gangbaren Weg vor. Über die Formulierung der Anforderungen zur geplanten Funktion werde ich in den nächsten Tagen nachdenken.

Danke und Grüße
Falkmar
rubberman
rubberman 19.01.2013 um 16:07:00 Uhr
Goto Top
Hallo Falkmar.

Letztlich kommst du zu der Erkenntnis, zu der ich dich schon die ganze Zeit hin zu schieben versuche. Zu einem Single Byte Zeichensatz gehört die Codepage als Interpretationshilfe.

Der Inhalt einer Datei besteht aus Einsen und Nullen (völlig egal welche Art von Datei). In irgendeiner Weise musst du dem OS oder dem lesenden Programm beibringen was es aus diesen Einsen und Nullen machen soll. Das kann über Metadaten passieren, über einen Dateiheader, über eine Dateiendung oder was auch immer. Völlig egal, Hauptsache der der die Daten erstellt spricht die selbe Sprache wie der der die Daten ließt oder gibt zumindest die Information mit, wie die Daten zu lesen sind.
Im Fall von Text ist das eben nochmal richtig kompliziert. Ich greife gern noch mal ein vorheriges Beispiel auf. Eine Datei hat folgenden Inhalt:
11000100
Die binäre Schreibweise ist ziemlich lang, deshalb hat es durchgesetzt das ganze hexadezimal darzustellen (hier wäre es 0xC4), aber tatsächlich gibt es für einen Rechner immer nur 1 und 0 -- Spannung an und Spannung aus für die Verarbeitung, magnetisch Nord und magnetisch Süd für die Speicherung auf Festplatte, Pit und Land für die Speicherung auf CD ROM ... Egal, solange es 2 klar abgrenzbare Zustände gibt. Aber das ist nichts neues. Sollte lediglich noch mal vor Augen führen, wie abstrakt das ganze Thema ist.

1. Frage - Wer oder was wird mit 11000100 gefüttert?
Je nach dem, was als Input erwartet wird, kann hier alles mögliche interpretiert werden. Angefangen bei 8 unterschiedlichen booleschen Informationen (Flags) über dezimal 196 oder eben auch eine Entsprechung als Zeichen.

2. Frage - Wenn der Ausdruck als Zeichen interpretiert wird (weil zB. ein Editor erwartet, dass der Input als Zeichenfolge interpretierbar ist), wie wird er interpretiert?
Tja, wir haben ein Byte, ein BOM ist nicht vorhanden, also ist es ein Zeichen aus einem Single Byte Zeichensatz. Der Editor liest 0xC4.

3. Frage - Wenn das Zeichen 0xC4 (als Beispiel) vom Editor gelesen wurde, wie wird es grafisch angezeigt?
Die Antwort: Es ist nicht definiert! Lediglich eine interne Definition für den jeweiligen Editor führt dazu, dass die default ACP oder OEMCP angezogen wird, oder dass nach anderen Informationen (Metadaten oder ähnliches) gesucht wird, oder dass ggf. über Mustervergleich eine Plausibilitätsprüfung durchgeführt wird.

Lediglich dann, wenn du dem Editor mitteilst wie 0xC4 darzustellen ist, gibt es die Ausgabe die du erwartest, nämlich bspw. 'Ä' bei CP 1252, 'ฤ' bei CP 874, 'Д' bei CP 1251, 'Δ' bei CP 1253 und was weiß ich wie viele Darstellungsmöglichkeiten es noch gibt.
Noch mal: Bei all diesen Zeichen war der Input gleich, nämlich 0xC4. Ohne Angabe der Codepage kann hier alles mögliche zur Anzeige kommen.

Einfacher wird es nun per Unicode. Hier ist die Zuordnung klar. Aber auch hier ist noch längst nicht alles toll. Ohne BOM ist nicht geklärt, wie die Daten gelesen werden müssen. Und genau da wird es interessant.
Reales Beispiel: Ich bekomme automatische Exportdateien aus unserem ERP System. Die Daten liegen UTF-8 codiert vor, allerdings ohne BOM. Will ich mir die Daten anzeigen lassen, muss ich einen Editor wählen, der entweder automatisch "vermutet" dass es UTF-8 ist, oder bei dem ich explizit UTF-8 zur Anzeige auswählen kann.
Diese Daten werden nun aber eigentlich automatisch weiter verarbeitet. Ein Delphi Programm liest sie aus. Dieses Programm erwartet, dass die Daten kein BOM haben, sonst käme es zu Fehlern ...


Fazit:
- Zu Singlebyte Zeichensätzen gehört die Codepage
- Zu Multibyte Zeichensätzen gehört das BOM oder es ist ganz klar definiert, dass die Daten IMMER in einer bestimmten Weise codiert vorliegen.

Grüße
Steffen
rubberman
rubberman 20.01.2013 um 19:01:56 Uhr
Goto Top
... und noch was zum Spielen, um das oben geschriebene noch mal zu veranschaulichen. Leider nur als VBScript - um das in die PowerShell zu portieren, reicht mein Wissen eben nicht face-sad

Voraussetzungen:
  • Windows
  • OpenOffice installiert (evtl. geöffnete Dokumente speichern und schließen)
  • Verzeichnis mit Schreibrechten

Was macht das Ding:
  • Datei test.txt erstellen und Byte 0xC4 rein schreiben
  • OOo im Hintergrund öffnen
  • Datei in einen Stream lesen
    • Stream wird jeweils für den Input mit unterschiedlichen Codepages vorkonfiguriert
    • gelesenes Byte in den Stream packen
  • Inhalt anzeigen
    • gelesener Inhalt aus dem Stream in einen String packen
    • String in Messagebox anzeigen
  • OOo schließen

*.vbs
Option Explicit
Const sFile = "test.txt"  
Dim oFSO, oOOSvcMan, oOODesktop, oFile, sUrl

'Dateisystem  
Set oFSO = CreateObject("Scripting.FileSystemObject")  

'Testdatei mit Inhalt 0xC4 schreiben  
Set oFile = oFSO.OpenTextFile(sFile, 2, True, 0)
oFile.Write Chr(&hC4)
oFile.Close
Set oFile = Nothing
If Not oFSO.FileExists(sFile) Then WScript.Quit 1

'OOo öffnen  
Call LoadOpenOfficeProcess(oFSO)

'OOo Servive Manager und OOo Desktop  
Set oOOSvcMan = CreateObject("com.sun.star.ServiceManager")  
Set oOODesktop = oOOSvcMan.createInstance("com.sun.star.frame.Desktop")  

'Testdatei mit unterschiedlichen Charsets lesen und ausgeben  
sUrl = GetURL(oFSO, oOOSvcMan, sFile)
Call DisplayFirstLine(oOOSvcMan, sUrl, "Windows-874")  
Call DisplayFirstLine(oOOSvcMan, sUrl, "Windows-1251")  
Call DisplayFirstLine(oOOSvcMan, sUrl, "Windows-1252")  
Call DisplayFirstLine(oOOSvcMan, sUrl, "Windows-1253")  
Call DisplayFirstLine(oOOSvcMan, sUrl, "Windows-1256")  

'Aufräumen  
Set oOOSvcMan = Nothing
oOODesktop.Terminate()
Set oOODesktop = Nothing
Set oFSO = Nothing

'~~~~~ Prozeduren und Funktionen ~~~~~  

Private Sub DisplayFirstLine(ByRef oOOSvcMan, ByVal sUrl, ByVal sEncoding)
  Dim oOOFileAccess, oOOFile, oOOTextInStream, s, sUni

  On Error Resume Next
  Set oOOFileAccess = oOOSvcMan.createInstance("com.sun.star.ucb.SimpleFileAccess")  
  Set oOOTextInStream = oOOSvcMan.createInstance("com.sun.star.io.TextInputStream")  
  Set oOOFile = oOOFileAccess.openFileRead(sUrl)
  oOOTextInStream.setEncoding(sEncoding)
  oOOTextInStream.setInputStream(oOOFile)
  s = oOOTextInStream.readLine()
  sUni = "U+" & Right("0000" & Hex(AscW(Left(s, 1))), 4)  
  MsgBox s & vbNewLine & sUni, vbOKOnly, sEncoding
  oOOTextInStream.closeInput()
  oOOFile.closeInput()
  Set oOOFile = Nothing
  Set oOOTextInStream = Nothing
  Set oOOFileAccess = Nothing
  On Error Goto 0
End Sub

Private Sub LoadOpenOfficeProcess(ByRef oFso)
  Const iHKCU = &H80000001
  Const iHKLM = &H80000002
  Const sWinMan = "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2"  
  Const sEvtSql = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"  
  Const iSW_HIDE = 0
  Const sErrMsg = "OpenOffice konnte nicht geladen werden!"  
  Dim oConfig, oEventSrc, oEvent, sExeFile, sExeFolder, iPID

  'Den Pfad der OpenOffice-Soffice.Exe in der Registry ermitteln  
  sExeFile = GetSofficeExePath(iHKCU)
  If IsEmpty(sExeFile) Then sExeFile = GetSofficeExePath(iHKLM)
  If IsEmpty(sExeFile) Then
    WScript.Echo sErrMsg:  WScript.Quit 1
  End IF

  'OpenOffice-Programm-Verzeichnis ermitteln  
  sExeFolder = oFso.GetParentFolderName(sExeFile)
  If sExeFolder = "" Then WScript.Echo sErrMsg:  WScript.Quit 1  

  'OpenOffice ohne GUI versteckt öffnen und warten bis der Prozess vollständig geladen ist  
  With GetObject(sWinMan)
    Set oConfig = .Get("Win32_ProcessStartup").SpawnInstance_:  oConfig.ShowWindow = iSW_HIDE  
    Set oEventSrc = .ExecNotificationQuery(sEvtSql)
    If .Get("Win32_Process").Create(sExeFile & " -invisible", sExeFolder, oConfig, iPID) Then  
      WScript.Echo sErrMsg:  WScript.Quit 1
    End if
    Do
      Set oEvent = oEventSrc.NextEvent()
      If oEvent.TargetInstance.Name = "soffice.bin" And oEvent.TargetInstance.ParentProcessID = iPID Then  
        Exit Do
      End If
    Loop
  End With
End Sub

Private Function GetSofficeExePath(ByVal iHKey)
  Const sRegKey = "Software\OpenOffice.Org\OpenOffice.Org\"  
  Const sRegValue = "Path"  
  Const sWinReg = "winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"  
  Dim aRegValues, sExePath

  'Pfad der soffice.exe aus der Registry ermitteln  
  With GetObject(sWinReg)
    .EnumKey iHKey, sRegKey, aRegValues
    If IsArray(aRegValues) Then
      If IsNumeric(aRegValues(0)) Then
        .GetStringValue iHKey, sRegKey & aRegValues(0), sRegValue, sExePath
      End If
    End If
  End With
  GetSofficeExePath = sExePath
End Function

Private Function GetURL(ByRef oFso, ByRef oOOSvcMan, ByVal sFilename)
  Dim aChars, sClient, sURL, i, oOOUriReferenceTranslator

  'Windows Pfad zu vorläufiger File URL (Leer- und Sonderzeichen bleiben unberührt)  
  If Left(sFilename, 2) = "\\" Then sClient = "File:" Else sClient = "File:///"  
  sURL = sClient & oFso.GetAbsolutePathName(sFilename)
  sURL = Replace(sURL, "\", "/")  

  'vorläufige File URL zu OOo-intern (Leer- und Sonderzeichen zu UTF-8 und URL Code)  
  Set oOOUriReferenceTranslator = oOOSvcMan.createInstance("com.sun.star.uri.ExternalUriReferenceTranslator")  
  sURL = oOOUriReferenceTranslator.translateToInternal(sURL)
  Set oOOUriReferenceTranslator = Nothing

  GetURL = sURL
End Function