Der Befehl sortiert den Inhalt jedes Unterverzeichnisses einzeln, und es gibt keine Möglichkeit, dieses Verhalten zu ändern.
Ein möglicher alternativer Ansatz ist den wmic
Befehl zu verwenden, die ein wenig langsam, aber fähig ist Ableiten die Datumsinformation (Erstellung, letzte Änderung, die letzte Zugriffs) in einem standardisierten, sortierbare, regions und locale- unabhängiges Format:
wmic FSDir where Name="D:\\Data" get CreationDate /VALUE
wmic FSDir where (Name="D:\\Data") get CreationDate /VALUE
unten sind zwei Skripte, so dass eine for /D /R
Schleife verwenden, um alle (Unter-) Verzeichnisse zu erhalten, werden die oben wmic
Befehlszeilen, for /F
ihre Leistung und einen einfachen Befehl erfassen die Sortierung zu tun, indem Alter.
Die erste erstellt eine temporäre Datei, die alle Verzeichnisse zu sammeln, zusammen mit ihrem Erstellungsdatum, in folgendem Format:
20170424215505.000000+060 D:\Data
Zum Sortieren des sort
Befehl verwendet wird. Hier ist der Code:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_ROOT=%~1" & rem // (use first command line argument as the root directory)
set "_PATTERN=*" & rem // (search pattern for directories; `*` matches all)
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (specify a temporary file)
rem // Write list of directory paths preceded by their creation dates to temporary file:
> "%_TMPF%" (
set "ERR=0"
rem // Enumerate all matching directories recursively:
for /D /R "%_ROOT%" %%D in ("%_PATTERN%") do (
rem // Store currently iterated directory path:
set "DIRPATH=%%~D"
rem // Toggle delayed expansion to avoid trouble with the exclamation mark:
setlocal EnableDelayedExpansion
(
rem /* Capture `wmic` output to query creation date of currently iterated
rem directory in locale-dependent and sortable format: */
for /F "tokens=2 delims==" %%L in ('
rem/ Do two attempts, because one approach can handle `^)` and one can handle `,`; ^&^
rem/ note that `wmic` cannot handle paths containing both of these characters: ^&^
2^> nul wmic FSDir where Name^="!DIRPATH:\=\\!" get CreationDate /VALUE ^|^|^
2^> nul wmic FSDir where ^(Name^="!DIRPATH:\=\\!"^) get CreationDate /VALUE
') do (
rem // Do nested loop to avoid Unicode conversion artefacts (`wmic` output):
for /F %%K in ("%%L") do echo(%%K !DIRPATH!
)
) || (
rem // This is only executed in case a path contains both `)` and `,`:
>&2 echo ERROR: Could not handle directory "!DIRPATH!"^^!
set "ERR=1"
)
endlocal
)
)
rem /* Return content of temporary file in sorted manner using `sort` command,
rem remember last item of sorted list; clean up temporary file: */
for /F "tokens=1*" %%C in ('sort "%_TMPF%" ^& del "%_TMPF%"') do set "LASTDIR=%%D"
rem // Return newest directory:
echo "%LASTDIR%"
endlocal
exit /B %ERR%
Die zweite speichert jedes Verzeichnis in einer Variablen des Erstellungsdatums benannt, in folgendem Format:
$20170424215505.000000+060=D:\Data
Für Sortierung, die set
Befehl wird verwendet. Hier ist der Code:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_ROOT=%~1" & rem // (use first command line argument as the root directory)
set "_PATTERN=*" & rem // (search pattern for directories; `*` matches all)
set "ERR=0"
rem // Clean up variables beginning with `$`:
for /F "delims==" %%C in ('2^> nul set "$"') do set "%%C="
rem // Enumerate all matching directories recursively:
for /D /R "%_ROOT%" %%D in ("%_PATTERN%") do (
rem // Store currently iterated directory path:
set "DIRPATH=%%~D"
rem // Toggle delayed expansion to avoid trouble with the exclamation mark:
setlocal EnableDelayedExpansion
(
rem /* Capture `wmic` output to query creation date of currently iterated
rem directory in locale-dependent and sortable format: */
for /F "tokens=2 delims==" %%L in ('
rem/ Do two attempts, because one approach can handle `^)` and one can handle `,`; ^&^
rem/ note that `wmic` cannot handle paths containing both of these characters: ^&^
2^> nul wmic FSDir where Name^="!DIRPATH:\=\\!" get CreationDate /VALUE ^|^|^
2^> nul wmic FSDir where ^(Name^="!DIRPATH:\=\\!"^) get CreationDate /VALUE
') do (
rem // Do nested loop to avoid Unicode conversion artefacts (`wmic` output):
for /F %%K in ("%%L") do (
rem /* Assign currently iterated path to variable named of the
rem respective creation date preceded by `$`: */
endlocal & set "$%%K=%%~D"
)
)
) || (
endlocal
rem // This is only executed in case a path contains both `)` and `,`:
>&2 echo ERROR: Could not handle directory "%%~D"!
set "ERR=1"
)
)
rem /* Return all variables beginning with `$` in sorted manner using `set` command,
rem remember last item of sorted list: */
for /F "tokens=1* delims==" %%C in ('2^> nul set "$"') do set "LASTDIR=%%D"
rem // Return newest directory:
echo "%LASTDIR%"
endlocal
exit /B %ERR%
'dir/od' Sortieren in der Reihenfolge des Datums für das aktuelle Verzeichnis, so wird Ihr Code den zuletzt erstellten Verzeichnisnamen im letzten gefundenen Verzeichnis auswählen, nicht die zuletzt erstellten von- Alle Verzeichnisse und Unterverzeichnisse. Sie müssten eine Liste von Verzeichnissen mit dem extrahierten Datum in ein yymmddhhmmss-Format sortieren, wenn Sie den zuletzt erstellten Verzeichnisnamen möchten. Nicht besonders schwer, aber auch keine One-Line. Überlegen Sie, ob Sie das Erstellungsdatum oder das Datum der letzten Aktualisierung benötigen - und warum dieses Verzeichnis? Suchen Sie eigentlich nach der letzten (erstellten) Datei? – Magoo
Das habe ich mir gedacht. Könnte ich nicht einfach eine Liste aller Verzeichnisse erstellen und sie dann nach erstelltem Datum sortieren? Mein Ziel ist es, das zuletzt erstellte Verzeichnis zu ermitteln und eine E-Mail-Benachrichtigung zu senden, wenn mehr als 20 Dateien darin enthalten sind. Ich habe alle anderen Aspekte des Skripts, nur nicht die Sortierung. –
Wenn sie alle im selben Verzeichnis sind, ja. Wenn dies nicht der Fall ist, müssen Sie die Daten vergleichen, indem Sie die Datumszeichenfolge (müssen wissen, welches Format Sie verwenden) in yymm aufspalten. Eine andere Möglichkeit könnte sein, den Verzeichnisbaum in eine Datei zu protokollieren und zu sehen, welche neue Scheinbar - wenn die neuen Verzeichnisse nicht alle ein Elternteil teilen, müssen Sie sie immer noch sortieren, indem Sie die Daten vergleichen. Möchten Sie nicht über alle neuen Verzeichnisse informiert werden, die> 20 Dateien enthalten? Das sollte einfacher zu bauen sein. – Magoo