![使用bat执行后批处理文件未返回正确值](https://linux22.com/image/1563009/%E4%BD%BF%E7%94%A8bat%E6%89%A7%E8%A1%8C%E5%90%8E%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E6%9C%AA%E8%BF%94%E5%9B%9E%E6%AD%A3%E7%A1%AE%E5%80%BC.png)
我在使用这个脚本时遇到了很多问题。它应该读取一个文件(用户指定的),然后将其保存到storeresult
环境变量中。
我正在使用 BAT 到 EXE 转换器,它不会影响任何批处理命令,所以不是那样。(如果你想知道为什么我调用storvar
而不是storvar.bat
)
主脚本(storvar.exe
):
set a=%~1
set b=%~2
set c=%~3
for /f "delims=" %%a in (stor\%a%.stor) do set storeresult=%%a
pause
我用来调用该脚本的脚本(调用时没有错误):
storevar Hi hi
pause
echo %storeresult%
pause
当我调用它时,它只是返回结果(%storeresult%
)没有任何内容,我找不到问题!
答案1
当你尝试定义和使用变量时,你必须始终注意其范围。
使用set
命令定义的环境变量只在定义它的进程范围内有效。用一个实验很容易证明:
- 打开一个命令提示符并尝试定义
set a = b
。使用set
来验证它是否被正确定义。 - 现在,打开第二个命令提示符并调用
set
。您会看到a
未在此范围内定义。
storvar.exe
是一个单独的进程。因此,它有自己的范围。您在其中定义的任何环境变量都会保留在那里,并在退出时被删除。
那么,还有其他选择吗?是的。我自己使用 PowerShell 而不是弃用的批处理文件;它可以从文件中提取内容并直接使用它们或将它们发送到下一个脚本。(微软官方支持将 PowerShell 编译为 EXE,尽管您也可以在 TechNet Gallery 上找到面向新手的版本。)AutoIt 是另一种选择。