-1

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

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

!replaceStr! 和!版本!不过很好(通过回声,我认为我不能使用 ! 内 ! 进行字符串替换。

从 VS 预构建命令运行时可能导致此操作失败但从 cmd 运行时工作正常的原因。我什至将 C:\windows\system32\cmd /c 添加到预构建中,但仍然无法正常工作。有什么想法吗?

谢谢!

4

2 回答 2

0

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

批处理文件使用它们在环境中运行的 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 函数判断调用进程的环境中是否定义了一个指定的变量,如果是,它的值是多少。

于 2013-10-17T02:34:50.943 回答
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%.

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

于 2013-10-17T07:20:16.220 回答