Batch file 通过DIR搜索文件后更改为目录
结果是在通过cmd通过DIR搜索文件后更改为directory 文件的位置是C:\Folder 以下代码可能吗Batch file 通过DIR搜索文件后更改为目录,batch-file,cmd,Batch File,Cmd,结果是在通过cmd通过DIR搜索文件后更改为directory 文件的位置是C:\Folder 以下代码可能吗 set /a variable= dir document.doc /s /p cd %%variable%% 将目录更改为C:\Folder尝试以下操作: for /f "delims=" %%# in ('dir document.doc /s /b') do ( set "new_dir=%%~dp#" ) cd /d "%new_dir%" 在命令提示窗口中运行se
set /a variable= dir document.doc /s /p
cd %%variable%%
将目录更改为C:\Folder尝试以下操作:
for /f "delims=" %%# in ('dir document.doc /s /b') do (
set "new_dir=%%~dp#"
)
cd /d "%new_dir%"
在命令提示窗口中运行
set/?
,从头到尾仔细阅读输出帮助。set/A
用于计算算术表达式。因此,Windows命令行解释器将set/A
之后的字符串解释为算术表达式(公式)
此命令行在执行时输出错误消息missing operator
,因为dir
被解释为变量名,并且document.doc
很可能不存在,因此在计算表达式时被替换为0
。但是cmd.exe
要求在这两个环境变量名之间有一个运算符,并且由于变量s
之前没有类似的运算符,因此会输出错误消息
无法使用commandSET将命令行(如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
此示例演示如何运行命令行,如dir“document*.doc”/A-D/B/S 2>nul
在一个单独的命令过程中,由FOR使用cmd.exe/C
启动,捕获写入句柄STDOUT的所有输出行,在这种情况下,将写入句柄STDERR的错误消息重定向到设备nul以抑制它
捕获的输出接下来由FOR逐行处理,使用默认选项跳过所有空行和以分号开头的行,并使用空格和制表符作为分隔符将每行拆分为子字符串(标记),只将第一个子字符串分配给指定的循环变量I
。通过使用定义空分隔符列表的“delims=“
”禁用此行分割行为,因此不再可能进行行分割。在这种情况下,DIR输出的行不可能以开头代码>所以我们不需要关心下线选项
%%~dpI
扩展到仅驱动器和当前文件名的路径以及path也可以分配给环境变量,例如使用设置“FilePath=%%~dpI”
。环境变量FilePath
可以在批处理文件的其余部分中引用,可以使用%FilePath%
立即展开,也可以使用!文件路径
将包含此变量引用的整个参数字符串括在双引号中,用于同时处理包含空格或以下字符之一的文件路径:&()[]{}^=;!'+`~代码>
两个批处理代码始终更改为firstfounddocument*.doc
分别document.doc
文件,并忽略分别与模式匹配且名称相同的所有其他文件,可能也是由在搜索目录树的其他目录中为或DIR找到的。第一种解决方案在需要搜索文件的大型目录树上更快。但第一种解决方案忽略隐藏的子目录,可以更改为包含例如document\u 1.doc
的目录,而不是document.doc
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
cd/?
dir/?
echo/?
获取/?
goto/?
暂停/?
另请阅读Microsoft关于的文章,了解2>nul
的解释。当Windows命令解释器在执行FOR的命令之前处理此命令行时,重定向操作符
必须在
上用插入符号^转义,以便命令行被解释为文字字符,该命令行以单独的方式执行嵌入的dir命令行命令进程在后台启动
@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