批处理脚本和视觉工作室预建

问题描述:

我有一个批处理脚本,它基本上是根据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的预生成和还是你在哪里设置变量不工作有什么想法

感谢

+0

有一点你的代码可以显示原因,是你在一个命令块中显示的行吗? – jeb

每个进程得到它的拷贝是父母的环境。?! 。但是你不能影响你的父进程的环境,只有子进程在他们开始的时候和他们自己的。

批处理文件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%

这工作,如果你的行不包含关键特殊字符,如插入记号^,百分比或报价。