130834
13.09.2016
2462
19
0
(Batch) Datum Sortier-Mechanismus
Hallo zusammen.
Ich bin schon etwas länger am Batch schreiben, und war schon oft uneingeloggt hier, und jetzt hab ich ein Problem bei dem ich gerne selbst Fragen würde.
Es geht darum das ich gerade eine Batch baue die Dateien, in meinem Fall Bilder, im aktuellen Ordner nach erstell-Datum sortiert. Der aktuelle Code macht etwa das:
Der aktuelle Pfad wird genommen - Alle Kreations-daten werden mit Datum und Zeit in eine TXT geschrieben, dann von einem mir unbekannten codeblock sortiert ( kopierter codeblock :sort )
und dann Sortiert in eine neue TXT ausgegeben. Mein Problem: die Sortierung fällt etwas falsch aus & stimmt aus irgendwelchen Gründen nicht immer + Da ich den Block nicht verstehe, kann ich ihn nicht meinen Bedürfnissen anpassen.
System Infos:
Windows 10
cmd, keine Zusatz-tools ausser compiler
hier ein Ausschnitt des ganzen:
Und hier ein paste des Outputs: http://pastebin.com/GYLmDH2w
wäre echt nett wenn mir jemand dabei helfen könnte ~
Lg clragon
Ich bin schon etwas länger am Batch schreiben, und war schon oft uneingeloggt hier, und jetzt hab ich ein Problem bei dem ich gerne selbst Fragen würde.
Es geht darum das ich gerade eine Batch baue die Dateien, in meinem Fall Bilder, im aktuellen Ordner nach erstell-Datum sortiert. Der aktuelle Code macht etwa das:
Der aktuelle Pfad wird genommen - Alle Kreations-daten werden mit Datum und Zeit in eine TXT geschrieben, dann von einem mir unbekannten codeblock sortiert ( kopierter codeblock :sort )
und dann Sortiert in eine neue TXT ausgegeben. Mein Problem: die Sortierung fällt etwas falsch aus & stimmt aus irgendwelchen Gründen nicht immer + Da ich den Block nicht verstehe, kann ich ihn nicht meinen Bedürfnissen anpassen.
System Infos:
Windows 10
cmd, keine Zusatz-tools ausser compiler
hier ein Ausschnitt des ganzen:
FOR /F "tokens=*" %%A in ('DIR /A:-D /B %folder%') do ( call :gDate "%%~fA" )
:gDate <File>
set "gFile=%~1" & set "gFate="
FOR /F "usebackq" %%B in (`wmic datafile where "Name='%gFile:\=\\%'" get^ creationdate^|find "+"`) do ( set gFate=%%~B )
echo=%~nx1,%gFate:~6,2%/%gFate:~4,2%/%gFate:~,4% %gFate:~8,2%:%gFate:~10,2%;%gFate:~12,2%>>file2.txt
exit /b
:sort
(
FOR /f "tokens=1*delims=, " %%h IN (file2.txt) DO (
FOR /f "tokens=1-7delims=/: " %%a IN ("%%i") DO (
SET /a rmonth=10+%%a
SET /a rday=10+%%b
SET /a rhour=10+%%d
IF %%d==12 (SET rhour=10)
ECHO %%c!rmonth!!rday!%%f!rhour!%%e,%%h,%%i
)
)
)>sorttemp.txt
(
FOR /f "tokens=1*delims=," %%i IN ('sort ^<sorttemp.txt') DO ECHO %%j
)>output.txt
TYPE output.txt
DEL sorttemp.txt /F /Q
pause >nul
exit
Und hier ein paste des Outputs: http://pastebin.com/GYLmDH2w
wäre echt nett wenn mir jemand dabei helfen könnte ~
Lg clragon
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 315162
Url: https://administrator.de/contentid/315162
Ausgedruckt am: 24.11.2024 um 18:11 Uhr
19 Kommentare
Neuester Kommentar
Hallo clragon und willkommen als Mitglied im Forum!
Was ist denn Dein gewünschtes Ergebnis? Nach Erstellungsdatum sortieren kann
An Dein Beispiel angepasst dann etwa so (mit Formatierung von Datum und Zeit lt Systemeinstellung):
<code">set "output=D:\output.txt"
:: in den Ordner %folder% wechseln
pushd "%folder%"
:: ev vorhandene Ausgabedatei löschen
del "%output%" 2>nul
:: sortierte Liste erzeugen
for /f "delims=" %%i in ('dir /b /a-d /tc /od') do for /f "tokens=1-2" %%a in ("%%~ti") do >>"%output%" echo %%i,%%a,%%b
:: zurück zum ursprünglichen Ordner
popd
Grüße
bastla
Was ist denn Dein gewünschtes Ergebnis? Nach Erstellungsdatum sortieren kann
dir
auch selbst - im einfachsten Fall:dir /a-d /tc /od %folder%
<code">set "output=D:\output.txt"
:: in den Ordner %folder% wechseln
pushd "%folder%"
:: ev vorhandene Ausgabedatei löschen
del "%output%" 2>nul
:: sortierte Liste erzeugen
for /f "delims=" %%i in ('dir /b /a-d /tc /od') do for /f "tokens=1-2" %%a in ("%%~ti") do >>"%output%" echo %%i,%%a,%%b
:: zurück zum ursprünglichen Ordner
popd
Grüße
bastla
Sorting? No problem at all...
Regards
@echo off
Powershell -Executionpolicy ByPass -Command "gci '.\*' -File | sort CreationTime | ft Name,CreationTime -AutoSize -Wrap" >Output.txt
Zitat von @130834:
but I highly prefer pure batch solutions...
Your solution above is also not pure batch, sort/wmic etc. are also external tools like powershell.exe is but I highly prefer pure batch solutions...
Zitat von @130834:
But power shell work's only above Windows 7,
No, XP can run the powershell as well, from Vista upwards its already integrated by default But power shell work's only above Windows 7,
and I can't inbind the whole shell while compiling,
What do you compile where?? You don't need to compile batch, it's done automatically.I hate power shell.
That is always said by people who don't know it I would rather write a c#/C/AutoIT app where every dependencies are included by default.
Packing batches in exes is bullshit (most antivirus claim that they are suspicious)
Sure only by adding the additional parameter -HidetableHeaders
Powershell -Executionpolicy ByPass -Command "gci '.\*' -File | sort CreationTime | ft Name,CreationTime -AutoSize -Wrap -HidetableHeaders" >Output.txt
simply swap the order, or better use export-csv for consistency.
Hallo clragon!
Grüße
bastla
Also soweit ich weiss und das ausprobiert habe, gibt der tc switch nicht das eigentliche Erstellungsdatum aus sondern nur das letzte änderungsdatum.
Ein dir /?
zeigt ua: /T Bestimmt welche Zeit verwendet wird (nur für NTFS).
Zeit C Erstellung
A Letzter Zugriff
W Letzter Schreibzugriff
/TC
liefert tatsächlich das Erstellungsdatum (für das Änderungsdatum brauchst Du /T
nicht, da Default).Das Ergebnis das ich gerne hätte ist eine TXT mit den Namen aller Dateien des aktuellen Ordners, dem Datum und der Zeit ihrer Erstellung.
Mein (inzwischen sogar getesteter ) Ansatz sähe für das von Dir gewünschte Ergebnis dann so aus:set "output=D:\output.txt"
:: in den Ordner %folder% wechseln
pushd "%folder%"
:: ev vorhandene Ausgabedatei löschen
del "%output%" 2>nul
:: sortierte Liste erzeugen
for /f "delims=" %%i in ('dir /b /a-d /tc /od') do for /f "tokens=1-2" %%a in ('dir /tc "%%~i"^|findstr "%%~i"') do >>"%output%" echo %%i,%%a,%%b
:: zurück zum ursprünglichen Ordner
popd
bastla