Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 批处理脚本和VisualStudio预构建_Visual Studio 2010_Batch File_Cmd_Prebuild - Fatal编程技术网

Visual studio 2010 批处理脚本和VisualStudio预构建

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

我有一个批处理脚本,它基本上根据VisualStudio预构建步骤中的配置进行一些字符串替换。当我从cmd运行批处理脚本时,它运行良好。但是,如果我从VS prebuild运行它,下面的行不会将%replaceStr%和%version%作为变量值进行计算。我甚至试着将这两个变量进行回显,但它们并没有作为变量进行计算

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%


如果您的代码行不包含关键的特殊字符,如插入符号、百分比或引号,则此操作有效。

代码中再多显示一点可以说明原因,您显示的代码行是否在命令块中?