Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 通过DIR搜索文件后更改为目录_Batch File_Cmd - Fatal编程技术网

Batch file 通过DIR搜索文件后更改为目录

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

结果是在通过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%"

在命令提示窗口中运行
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%
立即展开,也可以使用
!文件路径
将包含此变量引用的整个参数字符串括在双引号中,用于同时处理包含空格或以下字符之一的文件路径:
&()[]{}^=;!'+`~

两个批处理代码始终更改为firstfound
document*.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