批处理脚本和视觉工作室预建
我有一个批处理脚本,它基本上是根据visual studio的prebuild步骤中的配置进行一些字符串替换。批处理脚本在我从cmd运行时运行良好。但是,如果我从VS prebuild运行它,以下行不会将%replaceStr%和%version%评估为变量值。我甚至尝试回应这些2,他们不作为变量进行评估。批处理脚本和视觉工作室预建
if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!"
!replaceStr!和!版本!虽然(通过回声,我不认为我可以使用!内!)进行字符串替换
从VS prebuild命令运行时会失败,但从cmd运行时工作正常。加入C:\ WINDOWS \ SYSTEM32 \ CMD/C的预生成和还是你在哪里设置变量不工作有什么想法
感谢
每个进程得到它的拷贝是父母的环境。?! 。但是你不能影响你的父进程的环境,只有子进程在他们开始的时候和他们自己的。
批处理文件s使用它们在环境中运行的cmd.exe。这是影响其父环境的程序的唯一情况。
一个cmd的环境与另一个cmd的环境是分开的。
而且从Vista的Windows软件开发工具包
环境变量 每个进程都有包含一组环境变量及其值的环境块。命令处理器提供set命令来显示其环境块或创建新的环境变量。命令处理器启动的程序会继承命令处理器的环境变量。
默认情况下,子进程会继承其父进程的环境变量。但是,您可以通过创建一个新的环境块并将指针传递给CreateProcess函数作为参数,为子进程指定一个不同的环境。
每个环境块包含的环境变量中的格式如下:
Var1=Value1\0
Var2=Value2\0
Var3=Value3\0
...
VarN=ValueN\0\0
环境变量的名称不能包括等号(=)。进程的环境块的总大小不得超过32,767个字符。
GetEnvironmentStrings函数返回一个指向调用进程的环境块的指针。这应该被视为只读块;不要直接修改它。相反,使用SetEnvironmentVariable函数来更改环境变量。完成从GetEnvironmentStrings获取的环境块后,调用FreeEnvironmentStrings函数释放该块。
调用SetEnvironmentVariable对系统环境变量没有影响。用户可以使用控制面板添加或修改系统环境变量。以编程方式添加或修改系统环境变量,将它们添加到HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment注册表项中,然后广播一个WM_SETTINGCHANGE消息,并将lParam设置为字符串“Environment”。这使应用程序(如shell)能够获取更新。请注意,此键中列出的环境变量值限制为1024个字符。
的GetEnvironmentVariable函数确定一个指定的变量是否在所调用的过程的环境中定义,并且,如果是这样,它的值是什么。
我猜:
即使从命令行您的批处理文件不起作用。
我假设它第一次失败,但然后它的工作。
如果是这样的话,那么你的代码是一个括号块内。
也许你的代码看起来象
if %a%==%b% (
set version=%a%
if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!"
)
也就是说百分比变量的扩张时间的影响,他们在完整的块进行解析,扩大,但没有一行在这个时候被执行。
所以%version%
什么也不扩展(第一次运行),但接下来的运行将扩大正确。
为了避免这种情况,你可以使用不同的工艺,这取决于您的内容有问题的是。
call set "line=%%line:!replaceStr!=!version!%%"
解析器扩大该行两次,在第一次的感叹号展开,然后调用将扩大%line:rep=ver%
。
这工作,如果你的行不包含关键特殊字符,如插入记号^
,百分比或报价。
有一点你的代码可以显示原因,是你在一个命令块中显示的行吗? – jeb