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