Batch Größenangabe Byte in KiloByte konvertieren

S

Smartass

Gast
Hallo Community,

habe ohne irgendwelche Kenntnisse der Batch-Programmierung aus Google-Suchergebnissen folgende *.cmd-Datei zusammengestellt:

Code:
@ECHO OFF &SETLOCAL
(ECHO "DATEI"; "DATUM 1"; "DATUM 2"; "GROESSE"
     FOR /f "delims=" %%a IN ('dir /b /a-d') DO (
         FOR /f "tokens=1-3*" %%x IN ('dir /a-d /tc "%%~a"^|findstr "^[0-9]"') DO (   
            ECHO "<a href="../">%%a</a>"; "%%~ta"; "%%x %%y"; "%%z Bytes"
    )
))>01.csv
TYPE 01.csv

Das funktioniert - liest den Inhalt eines Verzeichnisses aus und erzeugt die erwünschte CSV-Datei:

Code:
"DATEI"; "DATUM 1"; "DATUM 2"; "GROESSE"
"<a href="../">01.cmd</a>"; "04.09.2014 08:45"; "02.09.2014 16:26"; "454 Bytes"
"<a href="../">01.csv</a>"; "04.09.2014 08:45"; "02.09.2014 23:15"; "147 Bytes"
"<a href="../">test.text</a>"; "04.09.2014 08:45"; "20.07.2014 00:40"; "168.665 Bytes"

Allerdings werden die Dateigrößen in Byte ausgegeben - ich bräuchte die Ausgabe jedoch in KiloByte -> und Hilfe

THX


Smartass
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yuuri,

danke schonmal für die Richtung ... bin allerdings ohne nähere Kenntnisse auf "Trial and Error" angewiesen ...

Code:
ECHO "<a href="../">%%a</a>"; "%%~ta"; "%%x %%y"; "%%z set/a kb Kilobyte""

funktioniert schon mal nicht :-) ... fürchte, ohne genauere Anleitung sitze ich da tagelang vor dem Problem.


Smartass
 
Soll das so angezeigt werden oder kommt das noch in eine Datenbank / steht PHP / Javascript zur Verfügung?
Damit sollte es sich doch dann leicht umrechnen lassen? Also nur falls du es per Batch nicht direkt hinbekommst.
 
Hallo Suxxess,

stimmt schon ... allerdings wäre mir halt der direkte Weg -also ohne nicht unbedingt notwendigem JS- lieber - und ja, ist Teil einer [privaten] Server-Anwendung [allerdings ohne PHP] ... und die CSV-Dateien fungieren dabei als Datenbanken.


Smartass
 
Zuletzt bearbeitet von einem Moderator:
Hallo firexs,

Thx für den von Dir verlinkten Thread - habs gerade grob durchgesehen ... dürfte schwieriger werden, als ich dachte.

Hallo Yuuri,

ehrlich k.A. ... seh mir gerade Export a PowerShell object to a comma-separated values CSV file an ... letztlich zu kompliziert; glaub einfach nicht, dass das auf die Schnelle hier vermittelbar wäre [zumindest mir ;-]

Wird wohl auf die von Suxxess angesprochene Lösung per JS rauslaufen.


Smartass
 
Zuletzt bearbeitet von einem Moderator:
Naja, eher sind JScript bzw. VB komplizierter als PS und teilweise ist JS bzw. VB auch gänzlich deaktiviert. Ne portablere und bessere Lösung ist PS also durchweg.
Code:
$p = @(,@("`"Datei`"","`"Datum 1`"","`"Datum 2`"","`"Größe`""))

gci | where { !$_.PSIsContainer } | % {
    $p += ,(
        "`"<a href=`"`"../`"`">$($_.Name)</a>`"", # "Name"
        "`"$($_.LastWriteTime.ToString())`"", # "Datum 1"
        "`"$($_.CreationTime.ToString())`"", # "Datum 2"
        "`"$(($_.Length / 1kb)) KiB`"" # "Größe"
    )
}

rm -Force .\out.csv -ErrorAction SilentlyContinue
$p | % {
    $_ -join ";" >> out.csv
}
erzeugt
Code:
"Datei";"Datum 1";"Datum 2";"Größe"
"<a href=""../"">btsync.txt</a>";"28.07.2014 10:16:49";"28.07.2014 09:48:23";"0.2333984375 KiB"
"<a href=""../"">Cygwin Setup.lnk</a>";"02.06.2014 16:11:47";"30.04.2014 17:13:56";"0.703125 KiB"
"<a href=""../"">mysqld-help.txt</a>";"30.08.2014 20:22:08";"30.08.2014 20:22:08";"237.966796875 KiB"
"<a href=""../"">out.csv</a>";"04.09.2014 11:58:07";"04.09.2014 11:41:20";"1.63671875 KiB"
"<a href=""../"">ttt.ps1</a>";"04.09.2014 11:59:28";"04.09.2014 11:30:28";"0.44140625 KiB"
"<a href=""../"">Virtual Network Editor.lnk</a>";"07.09.2013 22:02:37";"07.09.2013 14:05:25";"2.0234375 KiB"
"<a href=""../"">WizTree.exe</a>";"17.09.2013 19:25:28";"28.05.2014 10:21:37";"1680.2109375 KiB"
"<a href=""../"">WizTree.ini</a>";"27.08.2014 14:48:32";"18.07.2014 16:01:54";"0.8017578125 KiB"
Übrigens ist deine obige CSV nicht valid - Delimiter müssen doppelt escaped werden (aus " werden "" innerhalb des Strings).
 
Hallo Yuuri,

funktioniert exakt wie Dus beschrieben hast - kann jetzt *.ps1-Files ausführen - btw.- falls das bei Jemanden auch nicht auf Anhieb funktionieren sollte:

2yeixfz6.png

Also Windows PowerShell als Administrator ausführen und Set-ExecutionPolicy Unrestricted eingeben. Anschließend per J-Taste bestätigen.

Dein Powershellscript erzeugt dann auch die out.csv -> fettes THX [habs nicht so mit Win]

Nur Dein Zitat: ... Übrigens ist deine obige CSV nicht valid - Delimiter müssen doppelt escaped werden (aus " werden "" innerhalb des Strings) ... versteh ich nicht. Ich benötige ja die CSV-Datei genau in der Form, wie sie durch die im ersten Beitrag angeführte *.cmd erzeugt wird:

Code:
"DATEI"; "DATUM 1"; "DATUM 2"; "GROESSE"
"<a href="../">01.cmd</a>"; "04.09.2014 08:45"; "02.09.2014 16:26"; "454 Bytes"

und nicht wie durch die *.ps1 erzeugte:

Code:
"Datei";"Datum 1";"Datum 2";"Größe"
"<a href=""../"">btsync.txt</a>";"28.07.2014 10:16:49";"28.07.2014 09:48:23";"0.2333984375 KiB"

Da wären ja die erzeugten Links durch die zweifach hintereinander geschriebenen Anführungszeichen zumindest syntaktisch fehlerhaft - trotzdem ziemlich cool, Dein Code - und ebenso, dass Du mir diese Technologie eröffnet hast.

Werde es aber doch per JS realisieren, denn es handelt sich -wie erwähnt um eine rein private Anwendung- die, falls ich sie teilen sollte, dem Fremd-Anwender noch per noscript-Tag den entsprechenden Hinweis geben werde - und Zweitens, weil ich die Kilobyte-Anzeige doch in einem anderen Format benötige [es kommen keine Dateien kleiner als 1 KB in die CSV-DB und es sollen auch keine Nachkommastellen angezeigt werden].

THX


Smartass

-------

Nachtrag: :-D ie gesamte Anwendung basiert sowieso auf Java-Script -
ohne würden ohnehin keine Inhalte geladen werden.
 
Zuletzt bearbeitet von einem Moderator: (Nachtrag)
Smartass schrieb:
Also Windows PowerShell als Administrator ausführen und Set-ExecutionPolicy Unrestricted eingeben. Anschließend per J-Taste bestätigen.
Benutz lieber RemoteSigned.
Smartass schrieb:
Nur Dein Zitat: ... Übrigens ist deine obige CSV nicht valid - Delimiter müssen doppelt escaped werden (aus " werden "" innerhalb des Strings) ... versteh ich nicht.
Deine gelieferte CSV ist nicht korrekt.
http://de.wikipedia.org/wiki/CSV_%28Dateiformat%29 schrieb:
Um Sonderzeichen innerhalb der Daten nutzen zu können (z. B. Komma in Dezimalzahlwerten), wird ein Feldbegrenzerzeichen (auch: Textbegrenzungszeichen) benutzt. Normalerweise ist dieser Feldbegrenzer das Anführungszeichen ". Wenn der Feldbegrenzer selbst in den Daten enthalten ist, wird dieser im Datenfeld verdoppelt (siehe Maskierungszeichen).
Wenn dein Parser aber damit nicht klar kommt, musst du diese eben entfernen.

Aber nochmal: Mit JavaScript kommst du da nicht weit. JavaScript wird im Browser ausgeführt und kommt nicht auf Dateisystemebene. Was du hier verwenden musst ist JScript (eine Abwandlung von JavaScript) die im Windows Script Host läuft, mit welcher du einzig Zugriff aufs Dateisystem kriegst.
Code:
$p = @(,@("`"Datei`"","`"Datum 1`"","`"Datum 2`"","`"Größe`""))

gci | where { !$_.PSIsContainer } | % {
    $p += ,(
        "`"<a href=`"../`">$($_.Name)</a>`"", # "Name"
        "`"$($_.LastWriteTime.ToShortDateString()) $($_.LastWriteTime.ToShortTimeString())`"", # "Datum 1"
        "`"$($_.CreationTime.ToShortDateString()) $($_.CreationTime.ToShortTimeString())`"", # "Datum 2"
        "`"$("{0:N2}" -f ($_.Length / 1kb)) KiB`"" # "Größe"
    )
}

rm -Force .\out.csv -ErrorAction SilentlyContinue
$p | % {
    $_ -join ";" >> out.csv
}
erzeugt
Code:
"Datei";"Datum 1";"Datum 2";"Größe"
"<a href="../">btsync.txt</a>";"28.07.2014 10:16";"28.07.2014 09:48";"0,23 KiB"
"<a href="../">Cygwin Setup.lnk</a>";"02.06.2014 16:11";"30.04.2014 17:13";"0,70 KiB"
"<a href="../">mysqld-help.txt</a>";"30.08.2014 20:22";"30.08.2014 20:22";"237,97 KiB"
"<a href="../">out.csv</a>";"04.09.2014 14:41";"04.09.2014 11:41";"1,60 KiB"
"<a href="../">ttt.ps1</a>";"04.09.2014 14:41";"04.09.2014 11:30";"0,56 KiB"
"<a href="../">Virtual Network Editor.lnk</a>";"07.09.2013 22:02";"07.09.2013 14:05";"2,02 KiB"
"<a href="../">WizTree.exe</a>";"17.09.2013 19:25";"28.05.2014 10:21";"1.680,21 KiB"
"<a href="../">WizTree.ini</a>";"27.08.2014 14:48";"18.07.2014 16:01";"0,80 KiB"
 
Perfekt ;-) hab noch Zeile 8

Code:
 "`"$("{0:N2}" -f ($_.Length / 1kb)) KiB`"" # "Größe"

auf

Code:
 "`"$("{0:N0}" -f ($_.Length / 1kb)) KiB`"" # "Größe"

umgestellt [damit keine Kommastellen angezeigt werden]

Nochmals Danke


Smartass
 

Ähnliche Themen

Zurück
Oben