2013-02-26 105 views
-1

下面是我的批处理文件代码:在批处理文件中定义如何更新变量

@echo off & setlocal 
set ver1="doc pic\ABC\" 
set ver2="C:\Users\elmo\Desktop\error4.png" 
E: 
cd %ver1% 
copy %ver2% 

的问题是,我没有得到任何的方式来更新从我的节目这些变量;有什么办法,我可以这样做吗?

+0

什么程序?你究竟想要做什么?另外,'@echa off'? – LittleBobbyTables 2013-02-26 13:45:52

回答

0

进程的环境变量在父进程的进程启动时被填充。之后,无法在运行过程中更改或添加变量。

因此,如果你有你的批处理文件并从中运行另一个程序,然后尝试更改该程序的批处理文件的环境变量,那是不可能的。

如果您尝试另一种方式 - 即从另一个程序启动批处理文件,则可以通过在程序中首先设置它们来影响批处理文件的环境变量。

编辑:正如你所说,你有一个文本文件,其中包含您需要的信息。如果该文本文件需要另一个批处理文件的外观,比如最简单的方法是:

set ver1=foo 
set ver2=bar 

在这种情况下,你可能只是“包括”它

call foobar.cmd 

如果它看起来像这样代替:

ver1=foo 
ver2=bar 

你可以把它用for /f解析它,只是运行一个命令set每一行同样的工作:

for /f "delims=" %%L in (foobar.txt) do set "%%L" 

如果它只是看起来像这样:

foo 
bar 

那么一点点更多的工作需要(因为你只是含蓄地知道,第一行是ver1和第二ver2):

​​

现在,如果在解析该文本文件之前未定义ver1ver2,则此方法有效。如果你仅仅需要更新自己的价值观它变得混乱:

for /f "delims=" %%L in (foobar.txt) do (
    if not defined ver1updated (
    set "ver1=%%L" 
    set ver1updated=1 
) else if not defined ver2updated (
    set "ver2=%%L" 
    set ver2updated=1 
) 
) 
set ver1updated= 
set ver2updated= 

虽然在特定情况下,你可以采取的,有读取文件到一个变量两种方式的优势,他们在不同的他们如何处理多行:

set /p ver1=<foobar.txt 
for /f "delims=" %%L in (foobar.txt) do set ver2=%%L 

第一个将只存储文件的第一行,而第二种方法将更新文件中的每一行的变量,在最后线的值留下ver2。由于只有两行开始,这也是一个选项分开它们。但是在编写批处理文件时,我通常尽量不要混用习语,或者至少提供解释的评论。

正如你所看到的,它可能会变得有点复杂。通常对于这样的问题,如果你确切地说明了可以生成(如果有限制)或者你的输入和输出格式是什么格式(你可以编辑你的问题:-))。

+0

感谢乔伊的回应。让我告诉你更多的东西。我没有使用任何.NET技术来运行这个批处理文件,我使用了另一种名为sanscript的语言,它与VB6语法相似。它有一个功能,我可以使用它运行批处理文件,就像在RUN命令上运行一样..我的意思是如果我打开RUN提示并用完整路径写入批处理文件名并输入然后它会完成这项工作,我想知道可以我们将参数传递给批处理文件,而像运行它一样? – elmo 2013-02-27 07:40:03

+0

如果您从批处理文件运行外部程序,则可以解析其输出。或者您可以将文件存储在已知的位置,并让批处理文件读取它。所有的选项都有点难以解决,它取决于你可以(或愿意)做什么以及它需要的可靠程度。 – Joey 2013-02-27 09:15:52

+0

我已经创建了具有两个参数的文本文件,这个文本文件将从我的程序中创建,每次都会有新的/不同的值,现在我唯一的担心就是从批处理文件中的文本文件中读取两行文件,并更新ver1和ver2值。可能吗? – elmo 2013-02-27 09:34:31

1

如果使用set /P选项,则可以将该变量设置为提示的结果。

set /P ver1=Enter path: 

这将允许(强制)用户输入变量。具体来说,会提示用户

Enter path: 

然后,无论他们键入后将放入ver1。

注意,在这个例子中,用户可以输入一些空格的东西。你会更安全地把%ver1放在语音标记中,所以它是"%ver1"


要从外部文件加载,请尝试set /P ver1= <file.txt。您可能想要检查文件是否存在if exist file.txt (set /P ver1= <file.txt)

如果您希望允许用户在编辑文件之前更改文件,请事先简单调用pause并提示用户更改所需的文本文件。

例如,如果你想让用户看到什么路径设置,使他们可以先改变它们,你可以试试... ...

@echo off 
echo "Destination path (ver1.txt): " <ver1.txt 
echo "Source path (ver2.txt): " <ver2.txt 
echo "Please change the values in the text files as required." 
pause 
set /P ver1= <ver1.txt 
set /P ver2= <ver2.txt 

这已经有一段时间,因为我确实是这样的事情,所以我可能需要检查它,但我相信这应该工作。

+0

飞溅谢谢你从你的答复中得到很好的信息。 – elmo 2013-02-27 07:44:48

+0

@elmo如果它是正确的,随时打勾它作为正确的答案。如果没有,提供更多的信息,我可以帮助更多。 – Glenn 2013-02-27 08:49:47

+0

飞溅这是一个很好的信息,但在我的情况下,我不能强迫用户输入值。我可以在文本文件中直接读取这些值吗? – elmo 2013-02-27 09:27:38