以下是我的批处理文件中的代码:
@echo off & setlocal
set ver1="doc pic\ABC\"
set ver2="C:\Users\elmo\Desktop\error4.png"
E:
cd %ver1%
copy %ver2%
问题是我没有办法从我的程序中更新这些变量;我有什么方法可以这样做吗?
答案 0 :(得分: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
我实际做了类似的事情已经有一段时间了,所以我可能需要检查它,但我相信这应该有用。
答案 1 :(得分: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
):
for /f "delims=" %%L in (foobar.txt) do (
if not defined ver1 (
set "ver1=%%L"
) else if not defined ver2 (
set "ver2=%%L"
)
)
现在,如果在解析该文本文件之前未定义ver1
和ver2
,则此方法有效。如果你只需要更新它们的值就会变得更加混乱:
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
保留为 last 线。由于只有两行开头,因此也可以选择分隔它们。但是在编写批处理文件时,我通常会尽量不要混淆习语,或者至少提供一个评论来解释。
正如您所看到的,它可能会变得有点复杂。一般来说,如果您确切地说明了可以生成的格式(如果有限制)或者您的输入和输出格式究竟是什么(您也可以编辑您的问题:-)),这将有所帮助