将Windows cmd cd放入最新目录

将Windows cmd cd放入最新目录,windows,batch-file,directory,cd,Windows,Batch File,Directory,Cd,我有一个包含子目录的部署目录,每个部署一个子目录。我正在尝试编写一个批处理脚本,其中包括在最新的目录中执行cd 我知道如何在bash中实现这一点(也已经得到了解答),但我不知道如何在Windowscmd中实现这一点。有人能帮我吗?在批处理文件中,以下行可用于更改为具有最新修改日期的子目录: @echo off for /F "eol=| delims=" %%I in ('dir * /AD /B /O-D 2^>nul') do cd "%%I"

我有一个包含子目录的部署目录,每个部署一个子目录。我正在尝试编写一个批处理脚本,其中包括在最新的目录中执行
cd


我知道如何在
bash
中实现这一点(也已经得到了解答),但我不知道如何在Windows
cmd
中实现这一点。有人能帮我吗?

在批处理文件中,以下行可用于更改为具有最新修改日期的子目录:

@echo off
for /F "eol=| delims=" %%I in ('dir * /AD /B /O-D 2^>nul') do cd "%%I" & goto DoneCD
echo No subdirectory found in: "%CD%"
:DoneCD
带有选项
/F
的的命令启动一个新的命令进程,其中
%ComSpec%/c
和在
'
之间指定的命令行作为后台的进一步参数。因此,由
为执行的是通常的Windows安装路径:

C:\Windows\System32\cmd.exe /c dir * /AD /B /O-D 2>nul
DIR由后台命令执行进程使用指定参数进行搜索

  • 在当前目录中
  • 由于选项
    /AD
    (属性目录)而导致的目录
  • 匹配通配符模式
    *
    (全部)
和产出

  • 由于选项
    /B
    而采用裸格式,
  • 由于选项
    /O-D
    且未使用选项
    /TC
    (创建日期)或
    /TA
    (上次访问日期),按上次修改日期进行反向排序,这意味着首先是最新修改的目录,最后是最旧修改的目录
DIR的输出被写入处理已启动的后台命令进程的STDOUT

2>nul
将当前目录中未找到任何目录时由DIR输出的错误消息从句柄STDERR重定向到设备nul,以抑制此错误消息

阅读Microsoft关于的文章,了解有关
2>nul
的解释。重定向运算符
必须在上用插入符号
^
转义,以便在Windows命令解释器在执行for命令之前处理此命令行时,将命令行解释为文字字符ong>在后台启动的单独命令进程中执行嵌入的
dir
命令行

FOR捕获由DIR编写的所有内容,以处理启动的命令进程的STDOUT,并在启动
cmd.exe后逐行处理该输出

FOR忽略此处不出现的空行,因为DIR由于使用
/B
而输出没有空行的目录名列表

FOR默认情况下会将一行拆分为子字符串(标记)使用普通空格和水平制表符作为分隔符。完成此子字符串拆分后,默认情况下,FOR将检查第一个子字符串是否以默认的行尾字符
开头;
在这种情况下,该行将像空行一样被忽略。否则,FOR将分配第一个空格/制表符将字符串限制为指定的循环变量
I
,并将使用CDGOTO执行命令行

例如,目录名可以是
;Test Folder
,即以空格和分号开头并包含一个以上空格的目录名。这样的目录名将拆分为
;Test
(开头没有空格)和
文件夹
,然后被忽略,因为
;测试以分号开头

因此,行尾字符从默认分号重新定义为垂直条,带有
eol=|
,根据Microsoft文档,这是一个文件或文件夹名称不能包含的字符。并且在
For/F
options参数字符串末尾的
delims=
中禁用行拆分行为它定义了一个空的分隔符列表。因此,DIR输出的目录名被分配给循环变量
I
,而不做任何修改,即使它是一个非常不寻常的目录名

FOR执行命令CD,该命令将当前目录更改为当前目录最后修改的子目录,并执行下一个命令GOTO,以继续处理标签行
:DoneCD
下一行的批处理文件。因此FOR循环执行被禁用使用命令GOTO处理第一个目录名后已断开

当然,可以在FOR命令行和标签行
:DoneCD
之后使用其他命令,而不仅仅是ECHO行报告当前目录中找不到子目录,如引用动态环境变量
CD
所示,类似于退出批处理的命令行在这种不寻常的用例或错误情况下

在Windows命令提示符窗口中不能使用此FOR命令行,该命令行在CD之后退出FOR循环。Windows命令提示符窗口的解决方案是:

set "DoneCD=" & (@for /F "eol=| delims=" %I in ('dir * /AD /B /O-D 2^>nul') do @if not defined DoneCD cd "%I" & set "DoneCD=1") & set "DoneCD="
在批处理文件中,这将被写入

@set "DoneCD=" & (@for /F "eol=| delims=" %%I in ('dir * /AD /B /O-D 2^>nul') do @if not defined DoneCD cd "%%I" & set "DoneCD=1") & set "DoneCD="
或者在多行版本中使用附加的
echo
作为

@echo off
set "DoneCD="
for /F "eol=| delims=" %%I in ('dir * /AD /B /O-D 2^>nul') do (
    if not defined DoneCD (
        cd "%%I"
        set "DoneCD=1"
    )
)
if not defined DoneCD echo No subdirectory found in: "%CD%"
set "DoneCD="
首先,如果环境变量
DoneCD
是偶然定义的,那么它将被删除

NextFOR使用上述DIR运行
cmd.exe
,并处理具有最新修改日期的第一个输出目录。最新目录上的IF条件为真,因为执行o之前环境变量肯定未定义