批处理脚本和visual studio预建

时间:2013-10-08 23:55:09

标签: visual-studio-2010 batch-file cmd prebuild

我有一个批处理脚本,它基本上根据visual studio的预构建步骤中的配置进行一些字符串替换。当我从cmd运行它时,批处理脚本运行正常。但是如果我从VS prebuild运行它,则以下行不会将%replaceStr%和%version%作为变量值进行评估。我甚至尝试回应那些2并且它们不被评估为变量。

if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!"

!项replacestr!和!版本!虽然很好(通过回声,我不认为我可以使用!在!更换字符串。

从VS prebuild命令运行时可能导致失败但是从cmd运行时工作正常。我甚至将C:\ windows \ system32 \ cmd / c添加到prebuild但仍然无法正常工作。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您在哪里设置变量。每个进程都会获得其父级环境的副本。但是,您不能影响父进程在启动时的环境子进程以及它们自己的进程。

批处理文件使用它们在环境中运行的cmd.exe。这是影响其父环境的程序的唯一情况。

一个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函数确定是否在调用进程的环境中定义了指定的变量,如果是,则确定其值是什么。

答案 1 :(得分:0)

我想:

即使从命令行,您的批处理文件也不起作用 我假设它第一次失败,但它确实有效。

如果是这种情况,那么您的代码就在括号内。

也许您的代码看起来像这样

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%

如果您的专线不包含关键字^,百分比或引号等关键特殊字符,则此方法有效。