行为不端的变量在命令提示符下的Windows 10

时间:2019-01-31 20:08:57

标签: windows variables cmd

我对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%"

甚至没有被调用。

该如何解决?谢谢。

1 个答案:

答案 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%"