Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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
Node.js 在windows批处理文件中运行nodejs Handlebar时无法返回原始工作目录_Node.js_Batch File_Handlebars.js - Fatal编程技术网

Node.js 在windows批处理文件中运行nodejs Handlebar时无法返回原始工作目录

Node.js 在windows批处理文件中运行nodejs Handlebar时无法返回原始工作目录,node.js,batch-file,handlebars.js,Node.js,Batch File,Handlebars.js,1.bat-按预期执行:转到临时文件夹,执行某些操作,返回原始文件夹。当前工作目录(cwd)在运行1.bat前后相同 2.bat-当“do something”运行Handlebar nodejs包时,即使它只打印某些内容,退出批处理文件后,cwd也会更改 3.bat-不使用PUSHD、POPD。与2.bat相同 在运行类似的shell脚本时,cwd从不更改 问题是:怎么了?如何回到原来的cwd REM 1.bat PUSHD %CD% CD /D %TEMP% DIR POPD 正如

1.bat-按预期执行:转到临时文件夹,执行某些操作,返回原始文件夹。当前工作目录(cwd)在运行1.bat前后相同

2.bat-当“do something”运行Handlebar nodejs包时,即使它只打印某些内容,退出批处理文件后,cwd也会更改

3.bat-不使用PUSHD、POPD。与2.bat相同

在运行类似的shell脚本时,cwd从不更改

问题是:怎么了?如何回到原来的cwd

REM  1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD 



正如您所指出的,这是有效的

REM  1.bat
PUSHD %CD%
CD /D %TEMP%
DIR
POPD 
但这不是应该怎么写的

  • pushd
    的工作原理是保存当前active directory(稍后由
    popd
    检索),然后更改为指定的active directory,根据需要更改驱动器单元,并在更改为UNC路径时映射驱动器号(如有必要)

  • 应引用路径,以避免出现空格或特殊字符问题

所以,代码应该是

REM  1.bat
PUSHD "%temp%"
DIR
POPD 
现在,有问题的批处理文件可能是

但是,如果原始文件没有返回到以前的active directory,这也将失败

为什么??在windows中,handlebar命令是一个批处理文件。当一个批处理文件调用另一个批处理文件时,执行流被传输到被调用的文件,而不会返回给调用者,因此,
popd
将不会执行

要调用子批处理文件并将执行流返回给调用者,需要使用
call
命令

REM  2.bat
PUSHD "%temp%"
call handlebars --help
POPD 
这种情况下的另一种选择(如果不需要以任何环境变量的更改结束,也不需要继续在调用者中执行命令)是使用
setlocal
命令。它保存当前环境的一个副本,以允许我们在调用
endlocal
命令或批处理上下文结束时放弃对其所做的任何更改。此保存操作包括当前active directory

REM  2.bat
setlocal
cd /d "%temp%"
handlebars --help
现在,执行流不会返回到调用方,但它不是必需的。当子批处理文件(
handlebar
)结束时,批处理上下文被释放,并且在
setlocal
之后对环境的更改被还原

REM  2.bat
PUSHD "%temp%"
handlebars --help
POPD 
REM  2.bat
PUSHD "%temp%"
call handlebars --help
POPD 
REM  2.bat
setlocal
cd /d "%temp%"
handlebars --help