在 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 FOR
或 FOR /?
。只需从“开始”菜单运行 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/