Visual studio 2010 批处理脚本和VisualStudio预构建
我有一个批处理脚本,它基本上根据VisualStudio预构建步骤中的配置进行一些字符串替换。当我从cmd运行批处理脚本时,它运行良好。但是,如果我从VS prebuild运行它,下面的行不会将%replaceStr%和%version%作为变量值进行计算。我甚至试着将这两个变量进行回显,但它们并没有作为变量进行计算Visual studio 2010 批处理脚本和VisualStudio预构建,visual-studio-2010,batch-file,cmd,prebuild,Visual Studio 2010,Batch File,Cmd,Prebuild,我有一个批处理脚本,它基本上根据VisualStudio预构建步骤中的配置进行一些字符串替换。当我从cmd运行批处理脚本时,它运行良好。但是,如果我从VS prebuild运行它,下面的行不会将%replaceStr%和%version%作为变量值进行计算。我甚至试着将这两个变量进行回显,但它们并没有作为变量进行计算 if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!" !!替换!还有!版本虽然很好(通过echo
if NOT "!line!" == "" call set "line=!line:%replaceStr%=%version%!"
!!替换!还有!版本虽然很好(通过echo,我不认为我可以使用!in!替换字符串
当从VS prebuild命令运行时,是什么原因导致此操作失败,但当我从cmd运行时工作正常。我甚至在预编译中添加了C:\windows\system32\cmd/C,但仍然不工作。有什么想法吗
谢谢!您在哪里设置变量。每个进程都会获得其父进程环境的副本。但您不能在父进程环境启动时仅影响其子进程及其自己的子进程 批处理文件使用它们在环境中运行的cmd.exe。这是程序影响其父环境的唯一情况 一个cmd的环境与另一个cmd的环境是分离的 以及Vista的Windows软件开发工具包 环境变量 每个进程都有一个环境块,其中包含一组环境变量及其值。命令处理器提供set命令以显示其环境块或创建新的环境变量。由命令处理器启动的程序继承命令处理器的环境变量 默认情况下,子进程继承其父进程的环境变量。但是,您可以通过创建新的环境块并将指向它的指针作为参数传递给CreateProcess函数,为子进程指定不同的环境 每个环境块包含以下格式的环境变量:
Var1=Value1\0
Var2=Value2\0
Var3=Value3\0
...
VarN=ValueN\0\0
环境变量的名称不能包含等号(=)。进程的环境块的总大小不能超过32767个字符
GetEnvironmentStrings函数返回一个指向调用进程的环境块的指针。这应该被视为只读块;不要直接修改它。相反,请使用SetEnvironmentVariable函数更改环境变量。完成从GetEnvironmentStrings获取的环境块后,call使用FreeEnvironmentString函数释放块
调用SetEnvironmentVariable对系统环境变量没有影响。用户可以使用控制面板添加或修改系统环境变量。若要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE\system\CurrentControlSet\Control\Session Manager\environment注册表项,然后添加到broadcast 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%
如果您的代码行不包含关键的特殊字符,如插入符号、百分比或引号,则此操作有效。代码中再多显示一点可以说明原因,您显示的代码行是否在命令块中?