通过DIR搜索文件后切换到目录



>结果是通过 cmd 通过 DIR 搜索文件后更改为目录

文件的位置是 C:\文件夹

以下代码是否可行?

set /a variable= dir document.doc /s /p
cd %%variable%%

将目录更改为 C:\文件夹

试试这个:

for /f "delims=" %%# in ('dir document.doc /s /b') do (
set "new_dir=%%~dp#"
)
cd /d "%new_dir%"

在命令提示符窗口中运行set /?并仔细阅读从第一页到最后一页的输出帮助。
set /A用于计算算术表达式。因此,set /A后面的字符串由 Windows 命令行解释器解释为算术表达式(公式)。

set /a variable= dir document.doc /s /p

此命令行在执行时输出错误消息missing operator因为dir被解释为变量名,并且document.doc很可能不存在,因此在计算表达式时替换为0。但是cmd.exe期望在这两个环境变量名称之间有一个运算符,并且由于在变量s之前没有类似的运算符/,因此会输出错误消息。

无法使用命令SET将命令行(如dir document.doc /s /p)的可能多行输出分配给环境变量。

在批处理文件中,您可以使用以下代码:

@echo off
for /R %%I in ("document*.doc") do cd /D "%%~dpI" & goto FoundFile
echo Could not find any document*.doc in %CD% or its subdirectories.
pause
goto :EOF
:FoundFile
echo Found a file document*.doc in directory %CD%.
pause

命令FOR搜索与当前目录和所有非隐藏子目录中的模式document*.doc匹配的任何非隐藏文件。必须指定通配符(如*?)才能运行文件搜索。如果找到文件,则执行命令CD以更改为文件的目录,并通过跳转到标签退出循环。

真正只搜索文件document.doc的另一种解决方案:

@echo off
for /F "delims=" %%I in ('dir "document*.doc" /A-D /B /S 2^>nul') do cd /D "%%~dpI" & goto FoundFile
echo Could not find file document.doc in %CD% or its subdirectories.
pause
goto :EOF
:FoundFile
echo Found file document.doc in directory %CD%.
pause

此示例演示如何在由 FOR启动的单独命令进程中运行dir "document*.doc" /A-D /B /S 2>nul这样的命令行,cmd.exe /C捕获为处理STDOUT而编写的所有输出行,而在这种情况下,将编写用于处理STDERR的错误消息重定向到设备NUL以禁止它。

接下来由FOR逐行处理捕获的输出,使用默认选项跳过所有空行和以分号开头的行,并使用空格和制表符作为分隔符将每行拆分为子字符串(标记),仅将第一个子字符串分配给指定的循环变量I。通过使用定义分隔符空列表的"delims="禁用此换行行为,因此无法再进行换行。在这种情况下,DIR的行输出不可能以;开头,因此我们不需要关心eol(行尾)选项。

%%~dpI扩展到仅驱动器和带有路径的当前文件名的路径也可以分配给环境变量,例如使用set "FilePath=%%~dpI".环境变量FilePath可以在批处理文件的其余部分引用,可以使用%FilePath%立即扩展,也可以使用延迟扩展!FilePath!将包含此变量引用的整个参数字符串括在双引号中,以便也适用于包含空格或以下字符之一的文件路径:&()[]{}^=;!'+,`~

两个批处理代码总是更改为分别document.doc文件的第一个找到document*.doc并忽略与模式分别匹配的所有其他文件,这些文件可能也被搜索目录树中其他目录中的FORDIR找到。第一个解决方案在需要搜索文件的大型目录树上速度更快。但是第一种解决方案会忽略隐藏的子目录,并且可以更改为包含例如document_1.doc而不是document.doc的目录。

要了解使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • cd /?
  • dir /?
  • echo /?
  • for /?
  • goto /?
  • pause /?

另请阅读有关使用命令重定向运算符的Microsoft文章,了解2>nul的说明。当 Windows 命令解释器在执行命令 FOR 之前处理此命令行时,重定向运算符>必须使用FOR命令行上的插入符号^进行转义,该命令使用在后台启动的单独命令进程执行嵌入式dir命令行。

最新更新