将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
中实现这一点(也已经得到了解答),但我不知道如何在Windowscmd
中实现这一点。有人能帮我吗?在批处理文件中,以下行可用于更改为具有最新修改日期的子目录:
@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
2>nul
将当前目录中未找到任何目录时由DIR输出的错误消息从句柄STDERR重定向到设备nul,以抑制此错误消息
阅读Microsoft关于的文章,了解有关2>nul
的解释。重定向运算符
必须在上用插入符号^
转义,以便在Windows命令解释器在执行for命令之前处理此命令行时,将命令行解释为文字字符ong>在后台启动的单独命令进程中执行嵌入的dir
命令行
FOR捕获由DIR编写的所有内容,以处理启动的命令进程的STDOUT,并在启动cmd.exe后逐行处理该输出
FOR忽略此处不出现的空行,因为DIR由于使用/B
而输出没有空行的目录名列表
FOR默认情况下会将一行拆分为子字符串(标记)使用普通空格和水平制表符作为分隔符。完成此子字符串拆分后,默认情况下,FOR将检查第一个子字符串是否以默认的行尾字符开头;
在这种情况下,该行将像空行一样被忽略。否则,FOR将分配第一个空格/制表符将字符串限制为指定的循环变量I
,并将使用CD和GOTO执行命令行
例如,目录名可以是;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之前环境变量肯定未定义