1

以下は私のスクリプトです。1 レベル下のフォルダーを調べて、それらのフォルダーのみを選択しようとしているため、パスから最後の 9 文字を抽出する ~-9 です。ただし、同じフォルダー名が # 回繰り返されて出力が返されるため、 set var= は変数の設定を解除しません。また、バッチでは、この抽出トリックを %%i で直接実行できないため、ローカル変数が必要です。

次の反復で新しい値を取るように、この変数をクリアするにはどうすればよいですか?

@echo off
 for /d %%i in (%1\*) do (
  set var=%%i
  echo %var:~-9%
   set "var="
)
4

2 に答える 2

2

http://judago.webs.com/variablecatches.htmに私の問題の説明があります。魔法の行は、ローカルで有効な遅延展開に設定され、var を echo !var:~-9! として呼び出します。! 対% ...うわー!cmd はまだ私を驚かせます。

于 2012-07-11T20:10:35.080 に答える
0

問題の原因と解決策を見つけました-拡張の遅延。

ただし、遅延展開が有効になっているときに FOR を使用すると、ファイル名のいずれかに!文字が含まれている場合に問題が発生する可能性があります。値が含まれていて遅延展開が有効になっている場合、for 変数の展開は%%i破損します。!これは頻繁に発生する問題ではありませんが、発生します。

解決策は、ループ内で遅延拡張のオンとオフを切り替えることです

@echo off
setlocal disableDelayedExpansion
for /d %%i in (%1\*) do (
  set var=%%i
  setlocal enableDelayedExpansion
  echo !var:~-9!
  endlocal
)

また、 「1 レベル下のフォルダーを調べて、それらのフォルダーのみを選択しようとしているため、パスから最後の 9 文字を抽出する ~-9 」という意味についても疑問に思っています。主要なパス情報なしで、子フォルダーの名前を取得しようとしていると思われます。その場合、フォルダー名の長さが異なるため、部分文字列操作を使用することは適切な解決策ではありません。

先頭のパス情報なしでフォルダーの名前を取得する非常に簡単な方法があります。

for /d %%i in (%1\*) do echo %%~nxi
于 2012-07-11T20:18:33.913 に答える