Board logo

标题: 用什么办法可以使BAT结束,而变量值还在,还可以用呢? [打印本页]

作者: 024024     时间: 2006-3-23 17:35    标题: 用什么办法可以使BAT结束,而变量值还在,还可以用呢?

我在BAT文件中用SET设置了一些变量,可是BAT一结束,这些变量值也跟着消失了.
用什么办法可以使BAT结束,而变量值还在,还可以用呢?
作者: Climbing     时间: 2006-3-23 18:17
在批处理中使用Jscript或者VBscript来设置变量。如:

//test.js
var shell
shell = WScript.CreateObject("WScript.Shell")
shell.Environment("System").Item("DEVMGR_SHOW_NONPRESENT_DEVICES")='1'
作者: DOSforever     时间: 2006-3-23 18:34
如果你在批处理中没有特意的把所设的环境变量取消,本来它就一直存在的,没有必要动这个脑筋。除非你重新启动机器。
作者: Climbing     时间: 2006-3-23 18:40
楼上说得是不对的,在批处理中设置的环境变量只在一个cmd进程中有效,如果cmd进程关掉了,变量也就消失了。楼主肯定是直接双击执行批处理,执行完成后,相应的cmd进程就直接关掉了。就算不关掉,批处理设置的环境变量也只是在它运行的那个cmd环境中有效,而不是全局生效。不信试一下!

先打开一个cmd窗口,设置一个环境变量,再打开另一个cmd窗口,检查是否有相应的环境变量。
作者: DOSforever     时间: 2006-3-23 18:57
CMD?!
对不起,我只考虑纯 DOS 环境。

顺便和各位说一下我一直以来的看法:现在我们这个 DOS 论坛越来越不纯了,许多问题其实都是 Windows 下的,却发到什么“DOS问题解答室”来了,这样的例子可以举出许多,后面随便翻几页都有。如果我是版主的话,早就转了。当然,还有些问题属于比较低层的,和操作系统的关系不大,但论坛又没有专门开设一个这样的版面,可能是考虑到“疑难解答室”的人比较多,所以就发到这里来了吧。呵呵

另外,小嗑好长时间没见到你了,来,让我亲一个呵呵呵呵……
作者: Climbing     时间: 2006-3-23 20:24
也不能这么绝对,虽然cmd不同于dos,便我们的目的是利用计算机更好的为我们服务,何必过于执着呢?毕竟现在没有几个人拿纯dos工作,cmd环境下的应用要远远多于纯dos下的应用,何况,在批处理级别,二者也没有本质上的差别。
作者: willsort     时间: 2006-3-23 21:53
Re 024024l:

      环境变量的修改在程序结束后失效的情况主要有以下几类:

      1、在DOS/9x/NTs的COMMAND下,在批处理中使用%comspec%调用了另外的程序和子程序,并在其中修改变量,在结束%comspec%调用后这个修改将失效;

      解决:在结束%comspec%调用前将其中的环境变量保存到临时批处理文件中,在结束后再运行这个批处理重新设定变量。

      实例:
      %comspec% /c %0 : subroutin
      %temp%\_setlocal.bat
      goto end

      :subroutin
      set local=var1
      echo set local=%local% > %temp%\_setlocal.bat
      goto end

      :end

      2、在NTs的CMD下,在批处理中使用了setlocal这个环境变量本地化命令,自此以后,直到遇到endlocal或者批处理结束,其间所有环境变量的修改将于其后失效;

      解决:在批处理结束前,使用enlocal命令,并与环境变量设置语句合并运行;

      实例:
      setlocal
      set local=var1
      enlocal & set local=%local%

      3、在Win下的COMMND/CMD中,环境变量的修改通常只在当前的命令行环境中有效,它不会影响系统全局,或者以后所有的命令行环境;

      解决:使用Windows98安装盘上的增强工具 setx 设备变量。

      实例:
      setx local=var1

Re Climbing:

      MSDOS6.22 / MSDOS7.10/ COMAND@Win9x / COMMAND@WinXP / CMD@WinXP 这些环境的区别与联系异常复杂,他们对批处理的影响也难以估量。它直接导致我在编写完批处理后,必须反复验证它在各种环境下的兼容性,未经测试的环境决不会轻易署在它的可运行环境中,即使同为COMMAND或者CMD。
作者: linson     时间: 2006-3-23 22:06


  Quote:
Originally posted by Climbing at 2006-3-23 08:24 PM:
也不能这么绝对,虽然cmd不同于dos,便我们的目的是利用计算机更好的为我们服务,何必过于执着呢?毕竟现在没有几个人拿纯dos工作,cmd环境下的庠...

同意这种说法!
作者: DOSforever     时间: 2006-3-23 22:16


  Quote:
Originally posted by Climbing at 2006-3-23 20:24:
也不能这么绝对,虽然cmd不同于dos,便我们的目的是利用计算机更好的为我们服务,何必过于执着呢?毕竟现在没有几个人拿纯dos工作,cmd环境下的庠...

我说的不是指这个帖子,只是想到了就正好说几句,你去看看后面的几个帖子就知道了,有些问题连和命令行都无关。许多人都把 Windows 下的概念用到 DOS 上去了。
作者: 3742668     时间: 2006-3-23 22:45
最简单的方法:
在批处理的最后把你要保存的变量的赋值语句写到一个批处理文件,然后修改你的注册表使每次启动CMD的时候先执行那个批处理。如在你的批处理最后加上一句:
set myvar=%var% >> c:\mybat.bat
然后修改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor下的AutoRun值为c:\mybat.bat
这样你运行批处理或CMD的时候就会自动执行mybat.bat。
如果你不想修改注册表的话也可以在桌面点右键创建快捷方式,命令行中就输入:
cmd /k c:\mybat.bat
以后只要通过这个快捷方式来执行运行批处理就可以保证变量的值了
作者: bagpipe     时间: 2006-3-24 10:20
站内的DOS是有些不纯了,不过什么事情都是在变化,不能总停留在一个地方,我们希望的只是发挥我们最大的能力去支持和使用这个永远不过的系统---DOS