4

在 VS2008 中创建构建后事件时,我想检查 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 已打开。ECHO 开启。nono ECHO 已打开。

然后是属性消息等等。

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

如何使用环境变量?

(顺便说一句,我真正感兴趣的 _Attribs 也不包含任何内容。)

4

1 回答 1

12

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

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

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

于 2012-06-26T12:17:37.337 回答