批处理文件循环不显示最近的目录

时间:2017-04-24 03:33:35

标签: windows sorting batch-file cmd echo

我正在尝试遍历一个目录并将子目录映射到其他目录中,并拉出最近创建的目录。我在这里有一个循环,它将进入设置的根目录,只查看目录,合并所有子目录,按创建日期对它们进行排序,并将循环设置在列表末尾的循环设置为最多最近,然后回应了。但是,由于某种原因,排序不会正确发生。它不断拉出一个不是最新的目录。我似乎无法确定问题所在。可能是什么导致了这个?我正确使用排序吗?是不是将子目录与其他级别的其他目录进行比较?任何帮助将不胜感激。

@ECHO OFF
SET dir=C:\Users\Darren\Google Drive\
echo %dir%
FOR /F "delims=" %%i IN ('dir "%dir%" /b /s /ad-h /t:c /od') DO (
echo %%i
SET a=%%i)
SET sub=%a%
echo Most recent subfolder: %sub%

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q43579378.txt"
SET "filename2=%sourcedir%\q43579378_2.txt"
(
FOR /f "delims=" %%a IN (
 'dir /b /s /ad "%sourcedir%\*" '
 ) DO ECHO %%~a
)>"%filename1%"

IF EXIST "%filename2%" (
 FOR /f "delims=" %%a IN ('findstr /L /V /i /x /g:"%filename2%" "%filename1%"') DO (
  FOR /f %%c IN ('dir /b /a-d "%%a\*" 2^>nul^|find /c /v "" ') DO (
   IF %%c gtr 20 ECHO(send email directory %%a has %%c files
  )
 )
)

MOVE "%filename1%" "%filename2%" >nul
GOTO :EOF

我使用了一个测试目录sourcedir。当然,它不必与您正在扫描的目录相同,文件名可以是您喜欢的任何内容。

第一个for构建当前存在于filename1中的绝对目录名列表(包含for的“备用”括号对允许重定向)

如果filename2存在(将在第一次运行后的每次运行中),则使用filename1字面值{{1}查找filename2/L之间的差异}}与此文件中的/v不区分大小写/i完全匹配/x字符串不匹配,并将每个新目录名分配给/g:

然后扫描%%a目录,仅扫描文件,抑制"%%a"条消息并计算返回行数(file not found计数/c行不匹配{{1}一个空字符串)。将re4sult分配给/v,测试并选择采取行动的位置。

""命令的执行命令中的重定向器之前的插入符%%c转义重定向器,以便将它们解释为要执行的命令的一部分,不是^

答案 1 :(得分:0)

<xsl:for-each select="test/video/sec/pick"> <!-- sort keys must come first --> <xsl:sort select="substring(v, 5, 4)" data-type="number" order="descending" /> <xsl:sort select="substring(v, 3, 2)" data-type="number" order="descending" /> <xsl:sort select="substring(v, 1, 2)" data-type="number" order="descending" /> <xsl:sort select="substring(v, 9, 4)" data-type="number" order="descending" /> <xsl:copy-of select="."/> </xsl:for-each> 命令分别对每个子目录的内容进行排序,并且无法更改该行为。

一种可能的替代方法是使用dir /S /O命令,该命令有点慢,但能够在标准化,可排序,区域和区域设置中导出日期信息(创建,最后修改,最后访问) - 独立格式:

wmic

下面是两个脚本,它们使用wmic FSDir where Name="D:\\Data" get CreationDate /VALUE wmic FSDir where (Name="D:\\Data") get CreationDate /VALUE 循环来获取所有(子)目录,上面的for /D /R命令行,wmic来捕获它们的输出和一个简单的命令按年龄排序。

第一个创建一个临时文件,按以下格式收集所有目录及其创建日期:

for /F

对于排序,使用20170424215505.000000+060 D:\Data 命令。这是代码:

sort

第二个将每个目录存储在一个名为创建日期的变量中,格式如下:

@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%

对于排序,使用$20170424215505.000000+060=D:\Data 命令。这是代码:

set