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

时间:2018-01-07 15:29:13

标签: batch-file cmd

结果是通过DIR到cmd

搜索文件后更改为目录

文件的位置是C:\ Folder

可能是以下代码吗?

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

cd %%variable%%

将目录更改为C:\ Folder

2 个答案:

答案 0 :(得分:2)

试试这个:

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

cd /d "%new_dir%"

答案 1 :(得分:1)

在命令提示符窗口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

两个批处理代码始终分别更改为第一个找到document_1.doc document.doc个文件,并忽略所有其他文件,这些文件分别具有相同的名称,也可能由 FOR找到搜索目录树中其他目录中的 DIR 。第一个解决方案是在需要搜索文件的大型目录树上更快。但是第一个解决方案会忽略隐藏的子目录,并且可以更改为包含例如cd /?而不是dir /?的目录。

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

  • echo /?
  • for /?
  • goto /?
  • pause /?
  • 2>nul
  • >

另请阅读有关delayed expansion的Microsoft文章,了解^的说明。重定向运算符dir必须使用 FOR 命令行上的插入符{{1}}进行转义,以便在执行命令之前Windows命令解释程序处理此命令行时将其解释为文字字符FOR ,它在后台启动的单独命令进程中执行嵌入式{{1}}命令行。