.csv Daten in Batch anzeigen?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ich habe mal die meine graue Masse bis an die Grenzen strapaziert.

das Herzstück :replaceTableLineContent hatte ich ja ursprünglich ziemlich starr konzipiert Spagetticode auf 4 Spalten mit fest codierten Spaltenbreiten auf diese weise wären maximal 9 spalten möglich (Beschränkung der direkt adressierbaren Parameter auf %0 bis %9)

Iterieren mit %* ist problematisch, da Daten, welche * ? enhalten als Dateisuche angesehen werden was zu neuen Problemen führt. delayedExpansion und der Carret^-Bug schicken auch ! und ^ ins Abseits.

Die vollautomatisierte Variablen, machen zwar den Code flexibel, aber zerren an den Nerven... ich denke Dir wird Augenblicklich das Hirn durchschmoren. Allerding musst Du die Subroutinen nicht anfassen, diese kommen schon fast an OOP heran ... 🤔 Nicht wirklich🤤 Objektorientierung und Batch geht nicht.

Eigentlich muss man lediglich den Namen der Tabellenvariable und die Spaltenbreiten an :initTable übergeben, Die Subroutine erledigt die Verwaltung und Anpassung der Variablen von selbst.

:replaceTableLineContent übergibt den Inhalt für die Tabellspalten. Auch dieser wird vollautomatisch an die Spalten angepasst.

Batch ist kein Rennpferd und die einfache Handhabung meines Codes geht zu lasten der Geschwindigkeit (dabei habe ich schon "getrickst" , wo es ging.

Eine Optimierung ist das Speichern der Variablen für Rahmen und Überschriften.

Nach der ersten Initialisierung liest die Batch die Variablen aus der BatchName.ini so das diese für jede Tabelle nur einmal berechnet werden müssen. Erst durch löschen der .ini nimmt die Batch neue Werte an. ein durch auskommentieren schaltbarer Del - Befehl befindet in Zeile 8, so das Du beim Probieren nicht von Hand löschen musst.

Die Routinen zum auslesen der CSV kann man nicht nur im Hauptcode definieren, da dies auf die Bedürfnisse anpassbar sein sollen, sind ganz einfache For/f-Loops, welche die Daten an die "Tabellenautomatik" übergeben.

Zeichnen der Tabelle dürfte selbsterklärend sein.

(ggf delims=, zu delims=; ändern. Die [] sind nur nötig, wenn man mit Find .. Zeilen nummeriert ---Ausgabe: [1]Zeilen Text---)

Mehr will ich erst mal nicht machen, sonst gibt's ne Jacke mit ganz langen Ärmeln . das Ding ist schon so grenzwertig.

DrawTables.cmd

:: Achtung!!! die Zeichen ^ * ! und ? sind in den Arrayzuweisungen mit "call :addToArray ..." nicht erlaubt!!!
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion

set "ConfigFile=%~n0.ini"
  rem wenn beim start neu initialisiert werden soll entferne :: vor der nächsten Zeile
::del "%ConfigFile%" 2>nul

if exist "%ConfigFile%" (
      rem alle nötigen Variablen aus Datei laden (schneller)
    for /f "usebackq tokens=*" %%a in ("%ConfigFile%") do (set "%%a")
) else (
      rem sonst Initialisieren und Speichern  
    call :initTable Table1 5 15 20  40 20 10   &rem die Spaltenbreiten steuen  die Tabelle
    call :replaceTableLineContent Table1.HeaderLine "Nr."  "Überschr.2" "Überschrift 3"  "was anderes & noch mehr"  "was anderes2" "blubbbbbb" "blubbbbbb2" "blubbbbbb3"  
    
      rem es weil es so einfach ist auch  noch eine  2. Tabelle initialisiern
    call :initTable Table2 30 30  10 10 10 10 10 10   &rem die Spaltenbreiten steuen  die Tabelle
    call :replaceTableLineContent Table2.HeaderLine "huzlis"  "katzen"  "Schlümpfe"  "ralz" "blabalabu" "blubbbbbb2" "blubbbbbb3" 
    set "Table" > "%ConfigFile%"  &rem alle Variablen, welche  mit Table beginnen, in einem Rutsch in die .ini schreiben
)


echo %Table1.Top%
echo !Table1.HeaderLine!
echo %Table1.HeadBottom%
  rem csv auslesen... und Zeilen automatisch nummerieren
for /f "skip=2 tokens=1-6 delims=[]," %%a in ('find /v /n "" "demo.csv"') do (
      rem nicht  mehr Parameter angeben  als in  Tokens  definiert sind !!!
    call :replaceTableLineContent Table1.NewLine  "%%~a" "%%~b" "%%~c" "%%~d"  "%%~e" "%%~f"
    echo !Table1.NewLine!    
)
echo %Table1.Bottom%

  rem nächtste Tabelle anzeigen
echo %Table2.Top%
echo !Table2.HeaderLine!
echo %Table2.HeadBottom%
  rem eine  keine Variation  wenn  die Zählerei  mit  find  nicht  nötig ist...
  rem man  muss auch  nicht jedes Token verwenden
for /f "usebackq tokens=2,4,5-10 delims=," %%a in ("demo.csv") do (
      rem nicht  mehr Parameter angeben  als in  Tokens  definiert sind !!!
    call :replaceTableLineContent Table2.NewLine  "%%~a" "%%~b" "%%~c" "%%~d"  "%%~e" "%%~f" "%%~g" "%%~h"
    echo !Table2.NewLine!    
)
echo %Table2.Bottom%

  rem zur Demo  mal die erzeugten Variablen anzeigen
echo:
echo erzeugte Variablen:
set "Table"
set "__"

pause
exit /b
::: ab hier  sollte  es nicht  mehr  allzuviel zu tun geben

:::subroutines:::
:initTable

set "this=%~1"
if "%~2"=="" (
    echo Fehler  keine Parameter  für %0 %1 übergeben^^!
    pause
    exit /b
)
  rem Achtung!!! die Zeichen ^ * ! und ? sind in den Arrayzuweisungen mit "call :addToArray ..." nicht erlaubt!!!
set __Args=%*
call :addToArray  %this%.Columns  %__Args:* =%
set "__dummy=0"
for %%a in  (!%this%.Columns.Raw!) do (
    if !__dummy! lss %%a (
        set "%this%.MaxSpaces.Length=%%a"
        set "__dummy=%%a"
    )
)


call :MultChar %this%.MaxSpaces " " %%%this%.MaxSpaces.Length%%
  rem erzeuge die verschiedenen Liniensets (die Impliziten Variablen ArrayName.Base und ArrayName.MaxIndex geben die Grenzen vor)
for /l %%a in (!%this%.Columns.Base!,1,!%this%.Columns.MaxIndex!) do (
    call :MultChar Line.HDouble.%%a "═" %%%this%.Columns.%%a%%
    call :MultChar Line.HSingle.%%a "─" %%%this%.Columns.%%a%%

    set "%this%.Top=!%this%.Top!!Line.HDouble.%%a!╤"
    set "%this%.HeadBottom=!%this%.HeadBottom!!Line.HSingle.%%a!┼"
    set "%this%.Bottom=!%this%.Bottom!!Line.HDouble.%%a!╧"
    set "%this%.Line=!%this%.Line!PlaceHolder.%%a│"
)
for /f "delims==" %%a in ('set "Line."') do (set "%%a=") &rem ...und löschen, werden nicht mehr benötigt!

set "%this%.Top=╔!%this%.Top:~0,-1!╗"
set "%this%.HeadBottom=╟!%this%.HeadBottom:~0,-1!╢"
set "%this%.Bottom=╚!%this%.Bottom:~0,-1!╝"
set "%this%.Line=║!%this%.Line:~0,-1!║"
exit /b

:replaceTableLineContent
for /f "tokens=1,2 delims=. " %%a in ("%~1") do (set "this=%%~a")
set "__dummyNewLine=!%this%.Line!"
set "__dummySpaces=!%this%.MaxSpaces!"
set "__dummyArr.Base=0"
call :addToArray  __dummyArr  %*
for /l %%a in (!%this%.Columns.Base!,1,!%this%.Columns.MaxIndex!) do (
    call :formatToLen __dummyString "%%__dummyArr.%%~a%%" %%%this%.Columns.%%a%%
    call set "__dummyNewLine=%%__dummyNewLine:PlaceHolder.%%a=!__dummyString!%%"
)
set "%~1=%__dummyNewLine%"
for /f "delims==" %%a in ('set "__dummy"') do (set "%%a=")  &rem  alle __dummys Löschen
exit /b
:formatToLen
set "__dummyString=%~2%__dummySpaces%"
set "%~1=!__dummyString:~0,%~3!"
exit /b

:addToArray  %1=ArrayName  %2 bis ...= Werte   
set __Args=%*
set %~1= %__Args:* =%
set %~1.Raw=!%~1.Raw! %__Args:* =%
if not defined %~1.Base (set "%~1.Base=1")
if not defined %~1.MaxIndex ( set /a "%~1.MaxIndex=%~1.Base , %~1.NextIndex=%~1.Base" )
set "__dummyCount=!%~1.NextIndex!"
for %%a in (%__Args:* =%) do (
    set "%~1.!__dummyCount!=%%~a"
    set /a "%~1.MaxIndex=__dummyCount , __dummyCount+=1 , %~1.NextIndex=__dummyCount "
)
exit /b

:MultChar %1=varName %2=string %3=count
set "%~1="
for /l %%a in (1,1,%~3) do ( set "%~1=!%~1!%~2" )

exit /b

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Strumpfhouse 
Beitragsersteller
 25.04.2022, 18:47

Alter Finne.. sowas hätte ich niemals hingekriegt :o
Kann man die Ausgabe eigentlich auch auf unterschiedliche Seiten aufteilen, sodass man die Werte oben nicht verliert, wenn man mehrere Daten hat? In der cmd kann man ja scrollen, in der .bat nicht.

Die Nummerierung ist ja durch die variable %%~a definiert, kann man im Datensatz dahinter eigentlich auch selbst einzelne Zeilen dadurch z.B. als Echo ausgeben oder löschen etc? z.B indem man die Daten mit der nummerierung dann mit der choise funktion aufruft?

0
Erzesel  26.04.2022, 08:39
@Strumpfhouse

Ich Denke mir was aus...

Was ähnliches schwebte mit ohnehin schon vor. Funktionieren bei Dir die Escapesequenzen?

Die Cursorsteuerung wäre in dieser Beziehung durchaus interessant um nicht mit cls zu arbeiten und alles neu zu zeichnen.

cmd kann man ja scrollen, in der .bat nicht.

.bat nenne deine Batch nicht .bat. Der Emulationsmodus für Dos-Batch ist K💩cke. Mit der Extension .cmd arbeitet cmd.exe ohne das man auf hängen gebliebene Errorlevel aufpassen muss.

...Das nur am Rande

Die Scrollbalken im Batchfenster verschwinden nur, wenn man mir "mode n,n" den Screenbuffer auf Fenstergröße erzwingt.

Das Problem mit

Für die Geschwindigkeit bein zeichnen der Tabelle schwebte mir sowas wie ein "vorgerenderter" "Seitenbuffer" vor dessen Inhalt man nur stumpf mir type darstellt:

Auch das Problem mit den potentiellen *,? und ^ habe ich insoweit gelöst indem einfach ein Codemakro für die jeweilige Tabelle generiere. Ja man kann auch Code in einer Variable erzeugen, speichern und ausführen

War alles schon mal dagewesen...

CodeMacros sind wesentlich schneller als Subroutinen da der Batch-Interpreter ein solches am Stück im Speicher ausführt und nicht in der Batchdatei nach Labels suchen muss.

Für mich ist das Ganze bestenfalls der Versuch aus Holz und Steinen sowas wie ein Auto zu bauen... Einfach Hirnjogging damit ich nicht verkalke...

Willkommen bei den Feuersteins... Wilmaaa....😱

Es ginge auf jeden Fall einfacher den Ganzen Oberflächenkram mit Windows.Forms und C# oder Powershell zu realisieren und sich auf das Wesentliche, die Datenverarbeitung, zu konzentrieren.

Die Daten schreibt man mit einem Knopfdruck ins Fenster...

0
Strumpfhouse 
Beitragsersteller
 26.04.2022, 10:43
@Erzesel
Funktionieren bei Dir die Escapesequenzen?

Ja die funktionieren gut.. so Bunt :D

bat nenne deine Batch nicht .bat. Der Emulationsmodus für Dos-Batch ist K💩cke. Mit der Extension .cmd arbeitet cmd.exe ohne das man auf hängen gebliebene Errorlevel aufpassen muss.

Das stimmt aber ich nutze den Errorlevel für so ziemlich jedes meiner Auswahlmenüs. Wenn ich daraus eine .cmd mache funktionieren die Menüs dementsprechend nicht.

	choice /c cwa2345 >nul
	set /a "__result=%errorlevel%-1"
		if %errorlevel%==1 goto CAT.REGISTER
		if %errorlevel%==2 goto CAT.WAREHOUSE
		if %errorlevel%==3 goto CAT.LOGOUT
		if %errorlevel%==4 goto CAT.HOME.SETTINGS.LANGUAGE
		if %errorlevel%==5 goto CAT.HOME.SETTINGS.COLORS
		if %errorlevel%==6 goto CAT.HOME.SETTINGS.STORAGE
		if %errorlevel%==7 goto CAT.HOME.SETTINGS.CATEGORY

In dem Script möchte ich auch die Plätze (Barcodes an den Regalen, z.B. b0200140) so einbringen, dass man die im Script erstellen, löschen und bearbeiten kann. Ich hatte mir überlegt, ob ich mit einer .dll Datei arbeite, die Plätze und einen Status wie folgt

b0200140;UNLOCKED
b0200150;UNLOCKED
b0200240;LOCKED
b0200250;UNLOCKED

dort reinschreibe, das funktioniert auch. Das anzeigen, sprich die Übersicht der Plätze kriege ich auch noch hin aber das löschen einzelner Plätze sowie das ändern des Status einzelner Plätze will mir nicht gelingen. Ich hatte schon versucht die Platznummern selbst zu je einer einzelnen .dll zu machen und einfach den einzelnen Status durch Auswahl reinzuschreiben, die Übersicht aller Plätze mündet dann wohl aber auch in Chaos.

Wobei ich bei den Produkten auch noch nicht herausgefunden habe wie ich in der .csv einzelne Zeilen lösche. Ich hatte mir überlegt, dass ich die Zeilen überschreiben könnte und einfach einen Status des Produkts ändern könnte, sodass er die in der Übersicht der Produkte einfach nicht mit anzeigt. Das käme eventuell auch dem Vorhaben zugute, dass das System Produkte beim Aufnehmen, die schonmal ins System aufgenommen wurden erkennt und nach dem Scannen der EAN den Produkttitel und description übernimmt.

0
Erzesel  26.04.2022, 14:05
@Strumpfhouse

Mal kurz aus der Hüfte...

Es ist richtig so, dass Deine errorlevel in .cmd nicht funktionieren! Das es unter .bat funktioniert beruht auf einem Bug im alten command.com, welcher bei .bat emuliert wird. (welch Zufall, das gerade Du über solch ein altes Ding stolpert...)

Fast alle Befehle geben ein Errorlevel zurück 0 oder was andres,

Auch set! ...aber nicht bei .bat dort wird statt 0 zu liefern der bestehende Err aufrecht erhalten! ...Was natürlich das die Abfrage einer misslungenen Berechnung (div 0 etc) verfälschen kann. .cmd fixt dies.

Das man zwischen dem choice und der Abfrage der Errorlevel überhaupt irgendendeinen (errorlevel verändernden) Befehl ausführt, ist ohnehin Käse . Das ginge bei so ziemlich allen anderen Befehlen auch bei .bat schief.

Muss es unbedingt sein sowas zu tun, muss man den Errorlevel speichern, was Du ja irgendwie schon tust (eben nur 1 niedriger) , aber dann nicht zuende denkst... __result ist doch prima definiert😁

choice /c cwa2345 >nul
	set /a "__result=%errorlevel%-1"
		if %__result% equ 0 goto CAT.REGISTER
		if %__result% equ 1 goto CAT.WAREHOUSE
		if %__result% equ 2 goto CAT.LOGOUT

::...usw.

Dann Bei Zahlenvergleichen immer equ verwenden, == vergleicht immer Strings.

Mach nicht den "Bug" zum "Gärtner"😱

0
Strumpfhouse 
Beitragsersteller
 27.04.2022, 04:51
@Erzesel

choice /c cwa2345 >nul

set /a "__result=%errorlevel%-1"

if %__result% equ 0 goto CAT.REGISTER

if %__result% equ 1 goto CAT.WAREHOUSE

if %__result% equ 2 goto CAT.LOGOUT

::...usw.

Genau so mache ich das schon immer, auch abzgl. 1. Klappt so trd nur im batch.

0

read csv file through windows batch file and create txt file - Stack Overflow

Oder such nach "Batch read file per line" und "Batch split string" oder was auch immer dir dazu einfällt.

Oder - und das wäre klüger - Du versuchst es gar nicht mit Batch, das ist nämlich ziemlich eklig und auch gar nicht dafür gedacht.

Besser wäre, Du nutzt richtige Programmiersprachen, mit denen das sehr viel einfacher ist. Und es gibt meistens auf Frameworks (z.B. CsvHelper für .NET), die dir einen Großteil der Arbeit abnehmen.

ich konnte es mir nicht verkneifen das Ding auf die Welt losszulassen.

in Batch kann man TabellenZeilen nur durch Formatieren der Zelleninhalte auf die gewünschte Länge richtig schreiben.

das folgende ist wie alles in Batch gerade so flexibel, wie es erforderlich ist. :replaceTableLineContent kann wirlich nur mit den vorgegebenen 4 Spalten umgehen für mehr oder weniger Spalten müsste man entsprechen den Spagetticode anpassen. Nicht das ich das nicht flexibler hinbekommen hätte, aber dann wäre das ein übles unlesbares Monster geworden. (ist so schon übel genug, wenn man besseres mit einer Zeile Powershell gebacken bekommt)

demo.csv

test1,Bescreibung 1 blabla,Ratzeputz
test2,Beschreibung 2 mumbel,EierMops
test3,Beschreibung 3 laberhababer,Sumpfkuh

Table.cmd

@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion


:: create some TableTemplates
call :MultChar HDoubleLine.1 "═" 20
set "HDoubleLine.2=%HDoubleLine.1%"
call :MultChar HDoubleLine.3 "═" 40
set "HDoubleLine.4=%HDoubleLine.1%"


call :MultChar HLine.1 "─" 20
set "HLine.2=%HLine.1%"
call :MultChar HLine.3 "─" 40
set "HLine.4=%HLine.1%"


call :MultChar MaxSpaces " " 40


set "Table.Top=╔%HDoubleLine.1%╤%HDoubleLine.2%╤%HDoubleLine.3%╤%HDoubleLine.4%╗"
set "TableHead.Bottom=╟%HLine.1%┼%HLine.2%┼%HLine.3%┼%HLine.4%╢"
set "Table.Bottom=╚%HDoubleLine.1%╧%HDoubleLine.2%╧%HDoubleLine.3%╧%HDoubleLine.4%╝"
  rem Vorlage für innere Tabellenzeilen (Platzhalter  werden ersetzt)
set "Table.Line=║PlaceHolder.1│PlaceHolder.2│PlaceHolder.3│PlaceHolder.4║"


call  :replaceTableLineContent newHeaderLine  "Nr."  "Überschr.2" "Überschrift 3" "was anderes"
echo %Table.Top%
echo %newHeaderLine%
echo %TableHead.Bottom%
  rem csv auslesen... und Zeilen automatisch nummerieren
for /f "skip=2 tokens=1-3* delims=[]," %%a in ('find /n /v "" "demo.csv"') do (
  call :replaceTableLineContent newTableLine  "%%~a" "%%~b" "%%~c" "%%~d"
  echo !newTableLine!
)
echo %Table.Bottom%


pause
exit /b


:::subroutines:::
:MultChar %1=varName %2=string %3=count
set "%~1="
for /l %%a in (1,1,%~3) do (
    set "%~1=!%~1!%~2"
)
exit /b


:replaceTableLineContent  (recht statischer Spagetticode, sonst  blickt  keiner  mehr durch)
set "__tmpNewLine=%Table.Line%"
  rem übergebene Strings  auch Spaltenbreite formatieren
call :formatToLen __dummyString "%~2" 20
  rem Platzhalter  mit formatierten String ersetzen
set "__tmpNewLine=!__tmpNewLine:PlaceHolder.1=%__dummyString%!"
call :formatToLen __dummyString "%~3" 20
set "__tmpNewLine=!__tmpNewLine:PlaceHolder.2=%__dummyString%!"
call :formatToLen __dummyString "%~4" 40
set "__tmpNewLine=!__tmpNewLine:PlaceHolder.3=%__dummyString%!"
call :formatToLen __dummyString "%~5" 20
set "__tmpNewLine=!__tmpNewLine:PlaceHolder.4=%__dummyString%!"


set "%~1=%__tmpNewLine%"
exit /b

:formatToLen
set "__fString=%~2%MaxSpaces%"
set "%~1=!__fString:~0,%~3!"
exit /b
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Strumpfhouse 
Beitragsersteller
 23.04.2022, 12:45

@Erzesel , wie würde man bei der Tabelle eigentlich mehr Spalten hinzufügen?

0
Strumpfhouse 
Beitragsersteller
 20.04.2022, 16:39

Problem bei der Sache mit PowerShell ist, ich kann es nicht, trotz mehrerer Versuche es zu lernen. Ich lerne meist am besten durch Praxis, sprich suche mir Code, führe den aus, verändere ihn und lerne dadurch. Ich hatte mal versucht das Batch Script irgendwie in Powershell zu transformieren, das ist aber direkt gescheitert.

0
Palladin007  20.04.2022, 16:52
@Strumpfhouse
ich kann es nicht, trotz mehrerer Versuche es zu lernen. 

Ich verstehe den Satz nicht ... die Logik geht mir nicht in den Kopf :D

Was ist bei dir denn ein "Versuch"?
Ist das ein "Ich probiere ein paar Stunden rum und höre irgendwann auf, wenn es keinen Spaß macht"? Ja, dann wirst Du scheitern ;)
Powershel ist komplexer (komplex != schwer) als Batch, aber das auch aus guten Grund. Und es basiert auf .NET, was Du bei manchen Code-Snippets sehen kann, das eröffnet sehr viele Möglichkeiten, ist in diesen Fällen aber nicht gerade übersichtlich.

Also gib nicht auf, sondern setze dein Projekt damit um und wenn Du nicht voran kommst, finde raus, wie es geht. Wenn Du nur Batch nutzt, weil Batch schon Mal genutzt hast, wirst Du auf ewig fest stecken - bis Batch irgendwann ganz von der Bildfläche verschwindet.

sprich suche mir Code, führe den aus, verändere ihn und lerne dadurch

Vergiss nicht, dass Du auch verstehen musst, was, wann und warum der Code das tut, was er tut oder eben nicht ;) Nur ausprobieren, auswendig lernen und dann einen weiteren Punkt auf der Möglichkeiten-Liste hinzuzufügen bringt dich langfristig nicht weiter.

Ich hatte mal versucht das Batch Script irgendwie in Powershell zu transformieren, das ist aber direkt gescheitert.

Klar scheitert das, sind ja auch zwei völlig verschiedene Dinge

1
Strumpfhouse 
Beitragsersteller
 20.04.2022, 18:54
@Palladin007

okay, aber nur damit ich das verstehe..
Im Code vom Erzesel zeigt er die Daten aus der Excel Tabelle alle an erster Stelle anstatt in den anderen Kästen, warum ist das so? Die Lösung mit der formatierung ist ja mega elegant gelöst :o

0
Erzesel  20.04.2022, 19:22
@Strumpfhouse

in Batch scheinst Du die Funktion der Delimitterangabe auch nicht so recht kapiert zu haben... die Zeichen hinter delims sind die Zeichen an denen eine Inputzeile geteilt wird (delims=[],)bedeutetet da die Zeile an[] und , geteilt wird. Mach aus dem Komma ein Semikolon dann wird deine Zeile auch korrekt geteilt:

for /f "skip=2 tokens=1-3* delims=[];" %%a in ('find /n /v "" "demo.csv"') do (
  echo %%a blubb %%b blubb %%c blubb %%d
)
0
Erzesel  20.04.2022, 20:04
@Strumpfhouse
hatte mal versucht das Batch Script irgendwie in Powershell zu transformieren, das ist aber direkt gescheitert.

Natürlich hat Powershell eine andere Philosophie. 

Du siehst ja selbst welch enormer Aufwand in Batch nötig ist um selbst billigste Funktionalität herzustellen. 

Powershell ist oft viel einprägsamer, da die Namen der Cmdlets und deren Parameternamen schon von Haus aus sagen was sie tun. 

Eigentlich muss man sich auch nicht weiter um die Hintergründe der in den Pipelines "fließenden" Daten kümmern. (Die Cmdlets sin manchmal schon beängstigend intelligent) einem Date-Objekt zB. Ist es nahezu völlig egal wie man ihm ein Datum übergibt , Hauptsache es ist etwas, was irgendwie als legales Datum durchgeht:

Get-Date '2015/11/25 16:30'
Get-Date '2015/11/7'
Get-Date '18.März.2011'
Get-Date '18.Mar.2011'
Get-Date '13-7-2019'
Get-Date -Year 2015 -Month 8  -Day 27
#von der Ausgabe rede ich  Garnicht
Get-Date -Year 2015 -Month 8  -Day 27
(Get-Date).toString('yy.mm.dd')

in Batch wäre sowas Simples unvorstellbar😖

0
Strumpfhouse 
Beitragsersteller
 20.04.2022, 16:15
<a href="https://filehorst.de/d/eiHnklDm">Datei von filehorst.de laden</a>
0
Strumpfhouse 
Beitragsersteller
 20.04.2022, 16:20
@Strumpfhouse

Hatte das mal vor ewigkeiten angefangen und nun wieder herausgekramt, wollte für meinen kleinen Laden eine Art WMS Programm in Batch schreiben und dann mit Handscanner die Produkte einplegen usw.
Das ist der ganze Code, vieles ist provisorisch und so.. :D

0
Erzesel  20.04.2022, 20:03
@Strumpfhouse
filehorst.de laden

ok... ich hab die Batch runtergeladen und angeschaut...

echt tolle Fleißaufgabe... (das Ding scheint sich hauptsächlich um die Verwaltung der Oberfläche zu drehen. zugegeben ich habe es irgendwann aufgegeben nach funktionalem Code zu suchen.)

Solche Oberflächendefinitionen hab ich das letzte Mal in den frühen 90ern gesehen ...in Assembler. aber da haben wir den Textcoursor direkt gesteuert und in den Bildbuffer geschrieben.

(eigentlich schade um soviel Arbeit)😥😭

Bei sowas wäre ich heute schon längst auf C# oder Powershell mit .Net-GUI oder auf eine HTML/JavaScript/PHP -Lösung umgesattelt.

alle Deine vielen Textmasken die viele Mühe und ich baue mit ein Paar popeligen Formsanweisungen (sind nicht mal Befehle) in Powershell eine ähnlich Oberfläche als echtes GUI ...welches auch noch auf Knopfdrücke reagiert, dabei muss ich nie wieder den Code für die Oberfläche selbst anfassen, sondern nur ...Button_Action sagen was getan werden soll.

0
Palladin007  20.04.2022, 16:15

Du hattest Mal gesagt, Du bist in Rente?
Muss schön sein, so viel Zeit zu haben, um sowas schreiben zu können :D
Aber Respekt, so eine grausige Aufgabe und der Code sieht tatsächlich lesbar aus - soweit es mit Batch eben möglich ist.

0
Erzesel  20.04.2022, 20:16
@Palladin007
Muss schön sein, so viel Zeit zu haben, um sowas schreiben zu können

jep 👍. ist es...

Immernoch besser als Enten zu füttern...

Obwohl... selbst Dabei würde ich im Kopf mir irgendwelche Sachen ausknobeln. Wenn am Vormittag auf der Gassirunde eine mir genehme Frage lese, muss ich dem Hund ja nicht unbedingt bei seinen Hundesachen zuschauen.

wenn ich wieder Zuhause bin und der Haushalt gemacht ist , kann ich das Ersonnene tippen....

So ein Rentnertag hat schon gewisse Struktur...

1

Ich wusste es doch, ich vergesse selten einen Gast...

Dejavue...

Lediglich die Namen der Felder haben sich geändert...

Ich sehe bei Deiner Frage auch das Du vorhast eine Art grafischeinst Oberfläche auszugeben...

Alles machbar, aber der Aufwand um die Zeilen auf gleiche Breite zu formatieren ist enorm

Bei Deinen bisherigen Fragen sollte Dir aufgefallen sein, das Batch ziemlich störrisch ist wenn es um Text und Grafik geht.

Mal auf die schnell mit :

for /f "usebackq tokens=1-3* delims=," %%a in ("mydata.csv") do (
    Echo %%a  blubb   %%b  blubb %%c   muh %%d
)

...eine csv Datei aufzudröseln, kein Akt.

...aber Du willst hübsch....

Ich kann Dir nur raten Batch langsam den Rücken zu kehren...

In Powershell gibt's eine fertige Tabellenausgabe. Format-Table

Es geht aber auch richtig Komfortabel:

löse Du Dein Tabellen- Problemchen einfach mit Out-GridView

...und eine csv-Datei ließt man mit Import-CSV.

https://www.windowspro.de/script/csv-dateien-powershell-erstellen-sortieren-filtern

Im günstigsten Fall schreibst Du eine Tabelle ganze Oberfläche mit einer Zeile...

Import-CSV 'myData.csv' | Out-GridView

Hier noch etwas Howdo dazu:

https://www.techguy.at/powershell-out-gridview-und-passthru/ .

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren