用户在窗口中手动键入存储在变量中的输入数据。然后批处理对包含用户输入的数据(first.bat)的变量进行“回显”:
set source=%HOMEDRIVE%\test\data.txt
mydialogbox=%HOMEDRIVE%\test\myprogram_dialogbox.exe
SetLocal EnableDelayedExpansion
:: dialog box
for /f "tokens=1-3 delims=" %%i in ('%mydialogbox% --forms --title="Dialog" --text="Set Data" --add-entry="USER" --add-entry="PASSWORD" --add-entry="DBNAME" --separator=","') do (
set line=%%i
echo(!line: =!> %source%
)
IF EXIST %source% (GOTO setdata) else (GOTO end)
:setdata
FOR /F "eol=; tokens=1-3 delims=," %%A IN (%source%) DO (
set dbuser=%%A
set dbpass=%%B
set dbname=%%C
)
echo your imput: %dbuser% %dbpass% %dbname%
例如:
your input: mydb zuckerberg dadada
所以我需要%dbuser%
%dbpass%
%dbname%
在另一个脚本(second.bat)中替换这个值(这些变量:)
set dbname=foo
set dbuser=bar
set dbpass=blabla
预期输出(更改不能是动态的,而是永久的):
set dbname=mydb
set dbuser=zuckerberg
set dbpass=dadada
我该怎么做?
PS:在linux上这很容易
sed -e "s:$dbuser:zuckerberg:g" second.bat
PS:如果我的要求不起作用,那么有没有办法使用%dbuser%
%dbpass%
%dbname%
变量的输出 from first.bat
intosecond.bat
谢谢
更新:
- 我正在使用放屁,它已经奏效了:
first.bat
:
fart.exe second.bat "zuckerberg" "%dbuser%"
fart.exe second.bat "dadada" "%dbpass%"
fart.exe second.bat "mydb" "%dbname%"
但是我必须为每次替换执行 3 次相同的命令。我想知道是否有另一种不依赖外部程序的解决方案(.bat、.cmd)
- 另一种解决方案是将“回声”的输出放入变量中
second.bat
:
first.bat
:
echo your imput: %dbuser% %dbpass% %dbname%
second.bat
:
FOR /F "tokens=*" %%g IN ('echo %dbuser%') do (SET myuser=%%g)
etc
但这不会永久替换第二个脚本的变量值(这是我想要的)。
- 另一个解决方案是(
first.bat
):
(for /f "tokens=1* delims=:" %%a in (%source%) do (
if "%%b"=="" (echo %%a) else (
echo %%a|find " id" >null&& echo %%a: ||echo %%a: %%b
)
))>second.bat
但我无法根据自己的兴趣调整它,因为它会重写输出(不搜索和替换字符串)
call replacer.bat "second.bat" "zuckerberg" "%dbuser%"
它和放屁有同样的问题。我必须为每个替换运行一个命令(这对我的代码不是很优化)并且依赖于外部脚本
您可以使用该
call
函数来传递变量。%source%
在您的代码中,我将在此处引用file.txt
。file.txt内容:
really,big,rabbit
test1.bat内容:
test2.bat内容:
现在,如果你
test1.bat
在 cmd 中运行,你会得到输出:test2.bat 是您可以放置需要作为第二批运行的变量以对这些参数执行某些操作的地方。
在执行时传入经典的批处理脚本 cmd 参数
second.bat
应该没问题。使用这种方法完全不需要更改任何内容second.bat
。它本质上是
second.bat
动态的,并使用传入的参数参数作为包含传入参数值(例如)的占位符值(例如%~1
,%~2
等)的变量"flockingbird" "clockingmerge" "wishyword"
。二.bat
执行
您可以选择最适合执行或调用
second.bat
脚本的任何方法,无论是使用call
、start
、类似second.bat "flockingbird"
的方法还是在执行时传递参数值的任何其他方法second.bat
另一个例子
批
执行
输出
支持资源
命令行参数
将命令行参数(参数)传递给 Windows 批处理文件
开始
称呼
您不能在 CMD 会话之间共享局部变量。
您需要使用全局机制使它们可以从另一个会话访问,例如公共文件、注册表或系统变量(请参阅命令
setx
)。这是处理首次运行初始化所涉及的逻辑示例。强烈建议对用户输入作为参数传递的数据进行额外验证。