以下是我的批处理文件中的代码:
@echo off & setlocal
set ver1="doc pic\ABC\"
set ver2="C:\Users\elmo\Desktop\error4.png"
E:
cd %ver1%
copy %ver2%
问题是我没有办法从我的程序中更新这些变量;有什么办法可以做到吗?
以下是我的批处理文件中的代码:
@echo off & setlocal
set ver1="doc pic\ABC\"
set ver2="C:\Users\elmo\Desktop\error4.png"
E:
cd %ver1%
copy %ver2%
问题是我没有办法从我的程序中更新这些变量;有什么办法可以做到吗?
如果您使用该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)
如果您想允许用户在编辑之前更改文件,只需调用 a pause
before 并提示用户更改所需的文本文件。
例如,如果您希望用户查看设置了哪些路径以便他们可以先更改它们,您可以尝试...
@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
自从我实际上做了这样的事情已经有一段时间了,所以我可能需要检查一下,但我相信这应该可行。
进程的环境变量在进程启动时从父进程填充。之后就无法在正在运行的进程中更改或添加变量。
因此,如果您有批处理文件并从中运行另一个程序,然后尝试从该程序更改批处理文件的环境变量,那是不可能的。
如果您尝试相反的方式——即从另一个程序启动批处理文件,那么您可以通过在程序中首先设置它们来影响批处理文件的环境变量。
编辑:正如您所说,您有一个包含所需信息的文本文件。最简单的方法是,如果该文本文件采用另一个批处理文件的外观,例如:
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
的值。因为只有两行开头,所以也可以选择将它们分开。但是在编写批处理文件时,我通常尽量不要混合成语或至少提供注释来解释。
如您所见,它可能会变得有点复杂。一般来说,对于此类问题,如果您准确说明可以生成什么格式(如果有限制)或您的输入和输出格式到底是什么(您也可以编辑您的问题 :-)),将会有所帮助。