visual-studio-2008 - Visual Studio 2008 - 构建事件 : How to use Variable (set tmp ="abc" and %abc%)?

标签 visual-studio-2008 batch-file set environment-variables post-build-event

在 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\
  )

)

输出是:

x86 ECHO is on. ECHO is on. nono ECHO is on.



然后是属性消息等等。

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

如何使用环境变量?

(顺便说一句,_Attribs,我真的很感兴趣
in,也不包含任何东西。)

最佳答案

对于批处理新手,您有一个经典问题 - 您不能查看刚刚在循环(括号)中设置的值,因为整个循环都会被一次性解析。因此,您在执行循环之前看到了变量的值 - 显然不会起作用。解决方案是使用 SETLOCAL EnableDelayedExpansion 启用延迟扩展,然后使用延迟扩展作为 !var! 扩展您的变量。

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

文档中解释了延迟扩展和修饰符:只需从 Windows 命令行键入 HELP FORFOR /?。只需从“开始”菜单运行 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\
  )
)

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

关于visual-studio-2008 - Visual Studio 2008 - 构建事件 : How to use Variable (set tmp ="abc" and %abc%)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204239/

相关文章:

c# - 如何根据浏览器在同一页面上嵌入 32 位或 64 位 ActiveX 控件?

batch-file - MSBuild PSExec 在执行批处理文件时挂起而没有错误

windows - DOS 批处理脚本是否有 "set -e"?

python - 如何使用 python 找到最常见的集合?

visual-studio-2008 - 决定源代码控制软件

visual-studio-2008 - 涉及 "2dpt"的 Visual Studio 2008 结构命名语法错误

ms-access - 将 mdb 文件转换为 csv

python - 为什么 collections.MutableSet 不提供更新方法?

c# - 如何遍历类字段并设置属性

svn - Ankhsvn Subversion 迁移