Visual Studio 2008 - 构建事件:如何使用变量(设置tmp ="abc"和%abc%)?

And*_*iff 4 batch-file set environment-variables post-build-event visual-studio-2008

在VS2008中创建Post-Build事件时,我想检查xcopy操作的目标是否不是只读的.我找到了一些代码(http://forums.techguy.org/dos-other/842311-solved-checking-if-file-folder.html),它使用了一个临时变量,后来检查了某些属性.这是行不通的.当我手动打印变量时,它似乎是空的.

if $(PlatformName)==x86 (
  echo x86
  For /F "Delims=" %%I In ('Attrib $(ProjectDir)..\..\somedir\$(ConfigurationName)    \somemoredir\$(TargetName).dll') Do Set _Attribs=%%I
  If NOT "%_Attribs:~5,1%"=="R" (
    set test="monkey"
    echo %test%
    echo $(test)
    echo nono
    echo %_Attribs%
    echo $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\$(TargetName).dll
    attrib $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\$(TargetName).dll
    xcopy /Y $(ProjectDir)..\..\..\Runtime\bin\$(TargetName).*     $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\
  )
Run Code Online (Sandbox Code Playgroud)

)

输出是:

x86 ECHO已开启.ECHO正在开启.nono ECHO开启了.

然后是attrib消息等等.

echo%test%,echo $(test)等似乎表明测试变量不包含任何内容.

我如何使用环境变量?

(BTW,_Attribs,我真的很感兴趣,也没有任何东西.)

dbe*_*ham 12

批处理新手有一个经典问题 - 您无法查看刚刚在循环(括号)中设置的值,因为整个循环会立即被解析.所以你在循环执行之前就看到了变量的值 - 显然不会起作用.解决方案是SETLOCAL EnableDelayedExpansion使用延迟扩展启用延迟扩展,然后使用延迟扩展扩展您的变量!var!.

您关于如何获取文件属性的另一个问题 - 您可以使用~aFOR变量扩展修饰符来获取属性列表.在典型的Microsoft方式中,属性未与ATTRIBUTES命令以相同的顺序或大小写列出.只读标志r位于第2个字符(位置1).

文档中说明了延迟扩展和修改器:只需键入HELP FORFOR /?从Windows命令行输入.只需CMD从"开始"菜单运行即可获得命令行.

setlocal enableDelayedExpansion
if $(PlatformName)==x86 (
  echo x86
  for %%F In ("Attrib $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\$(TargetName).dll") do set _Attribs=%%~aF
  if not "!_Attribs:~1,1!"=="r" (
    set test="monkey"
    echo !test!
    echo $(test)
    echo nono
    echo !_Attribs!
    echo $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\$(TargetName).dll
    attrib $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\$(TargetName).dll
    xcopy /Y $(ProjectDir)..\..\..\Runtime\bin\$(TargetName).*  $(ProjectDir)..\..\somedir\$(ConfigurationName)\somemoredir\
  )
)
Run Code Online (Sandbox Code Playgroud)

您可以像在原始命令中一样使用ATTRIB命令 - 只需确保使用!_Attribs:~5,1!而不是%_Attribs:~5,1%.但是~a我提供的修改器解决方案更有效,因为它使用简单的FOR循环而不必使用FOR/F执行命令.