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

)。

出力は次のとおりです。

x86ECHOがオンになっています。ECHOがオンになっています。nonoECHOがオンになっています。

次に、属性メッセージなど。

echo%test%、echo $(test)などは、テスト変数に何も含まれていないことを示しているようです。

環境変数を使用するにはどうすればよいですか?

(ところで、私が本当に興味を持っている_Attribsにも何も含まれていません。)

4

1 に答える 1

12

バッチ初心者には古典的な問題があります-ループ全体が一度に解析されるため、ループ内で設定した値(括弧)を確認することはできません。したがって、ループが実行される前の変数の値が表示されています。明らかに機能しません。解決策は、で遅延拡張を有効にしてから、遅延拡張をSETLOCAL EnableDelayedExpansion使用して変数を拡張すること!var!です。

ファイル属性を取得する方法に関する他の問題~a-FOR変数展開修飾子を使用して属性のリストを取得できます。通常のMicrosoftの方法では、属性はATTRIBUTESコマンドと同じ順序または大文字と小文字で表示されません。読み取り専用フラグはr2番目の文字(位置1)にあります。

遅延拡張と修飾子の両方がドキュメントで説明されています:単に入力HELP FORするかFOR /?、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 に答える