我对Windows cmd中的变量有疑问。 任务:在与主脚本相同的文件夹中浏览所有目录,搜索具有特定名称的文件,输入这些目录,运行这些文件,返回到原始文件夹。
主要脚本是:
SET origin=%~dp0
Echo "%origin%"
cd "%origin%"
for /R .\ %%a IN (*file_to_run_name.cmd) do (
echo "%%a"
echo "%%~da%%~pa"
cd "%%~da%%~pa"
%%a )
Echo "%origin%"
cd "%origin%"
该脚本执行,我需要的除外一两件事:它不会改变工作目录到原来的一个。更确切地说,最后一个片段:
Echo "%origin%"
cd "%origin%"
甚至没有被调用。
该如何解决?谢谢。
答案 0 :(得分:0)
不是错误的变量。您正在尝试运行其他批处理脚本(.cmd
),除非您使用call
,否则执行控制不会返回到主脚本。另外,使用cd
/D
而不是仅使用/D
,因为如果目标目录在另一个驱动器上,则必须使用/D
。字符串%%~da%%~pa
可以简化为%%~dpa
。最后,让我建议使用引用的set
语法保护特殊字符。
这是固定代码:
set "origin=%~dp0"
echo "%origin%"
cd /D "%origin%"
for /R .\ %%a in (*file_to_run_name.cmd) do (
echo "%%a"
echo "%%~dpa"
cd /D "%%~dpa"
call "%%a"
)
echo "%origin%"
cd /D "%origin%"
但是,这仍然可以改进:存在命令pushd
(用于存储当前目录,然后更改为指定的目录)和popd
(用于恢复先前存储的目录),因此您无需将原始路径存储到变量。
这是应用它们的方法:
echo "%~dp0"
cd /D "%~dp0"
for /R .\ %%a in (*file_to_run_name.cmd) do (
echo "%%a"
echo "%%~dpa"
pushd "%%~dpa"
call "%%a"
popd
)
echo "%CD%"