0

3番目のforループとそれをサポートするコードを既存のコードに統合しようとすると、理解の限界に達しました。この複雑な「EnableDelayedExpansion」環境でさまざまな変数を参照する方法に完全に迷っています。

さらに、「EnableDelayedExpansion」/ endlocalは、各Forループでオン/オフにするか、プログラムの開始と終了で1回だけオン/オフにする必要があります。

:: ------------------ Beg For #1
      For /L %%a in (%XBEG%,1,%XEND%) do (
      cls
      echo :    %%a
      set L=1
:: ------------------ Beg For #2
      For /F "delims=" %%b in (%XDRV%%XPATH%%%a\1dir%%a.txt) do (
        set XTITLE=%%b
        echo Line !L!: !XTITLE!
        If not {!XTITLE!}=={!XTITLE:%XDRV%%XPATH%%%a\!} set XTITLE=!XTITLE:~18,-4!
        ::
:: ------------------ Beg For #3 --- New code
::   Write title to the xtemp file.  Place the redirection
:: symbol, i.e., greater than sign, IMMEDIATELY after vari
:: to avoid a trailing space, i.e., ( %vari%> )
      echo !XTITLE!> %XDRV%%XPATH%xtemp.txt
::   Get the file size in bytes, each byte = one character
      For %%c in (%XDRV%%XPATH%xtemp.txt) do set /a XLEN=%%~zc
::   Subtract 2 bytes, 1 for CR, 1 for LF, from Length
      set /a XLEN -=2

      cls
      echo : ===[  Debug  ]======================================
      echo - !XTITLE! - has !XLEN! characters.
      set /a XPAD=50-!XLEN!
      echo - Xpad is !XPAD!

::    Build the Index entry
      set XENTRY=%XPADs%%XTITLE%%XPAD%%%a
      echo - %XENTRY%
      pause

:: remove the xtemp file
      del %XDRV%%XPATH%xtemp.txt
        set /a L=!L!+1
        pause
:: ------------------ end of New code
      ):: End For #2
    )
:: End For #1
::        Clean Up For3
      set XTITLE=
      set L=
     Goto DOS

「EnableDelayedExpansion」/endlocalは現在、プログラムの開始と終了に配置されています。

あなたの助けが切実に必要であり、非常に高く評価されるので、この状況がコミュニティにとって十分な関心を持っていることを願っています。

4

1 に答える 1

2

あなたの問題が何であるかを正確に述べることは決してありません。あなたはファイル パスで奇妙なことをしていますが、あなたがしていることに意味があるかどうかはわかりません。

私はいくつかの明確なバグを見ます:

1)If not {!XTITLE!}=={!XTITLE:%XDRV%%XPATH%%%a\!} ... 変数にパス文字列が含まれているかどうかをテストするために、検索と置換を試みているようです。しかし、あなたはあなたのを忘れ=ました。また、IF テスト内で遅延拡張を使用して検索と置換または部分文字列操作を行う場合は、引用符を使用する必要があります。

訂正:

if not "!XTITLE!"=="!XTITLE:%XDRV%%XPATH%%%a\=!" ...

2) この既存のコードに追加の遅延拡張が必要です。また、余分な不要なs. また、課題の最後に隠しスペースがないように、引用符を使用することも好きです。

set XENTRY=%XPADs%%XTITLE%%XPAD%%%a
echo - %XENTRY%

訂正:

set "XENTRY=!XPAD!!XTITLE!!XPAD!%%a"
echo - !XENTRY!

一般に、割り当て中にコードでより多くの引用符を使用できると思います。

他にも問題があるかもしれませんが、それはコードを実際にテストせず、何をすべきかを知らずに私が目にするものです。


いくつかの最適化が可能です

1) 反復ごとに一時ファイルを削除する必要はありません。外側のループの外側の最後で削除するだけです。

2) 2 番目の SET /A を削除し、3 番目のループ内で 2 を引くことができます。

For %%c in (%XDRV%%XPATH%xtemp.txt) do set /a XLEN=%%~zc - 2

3) 最後に各変数をクリアする必要はありません。最初に SETLOCAL を、最後に ENDLOCAL を指定するだけです。


いつ遅延拡張を有効にするかについて: ほとんどの場合、最初に遅延拡張を有効にできます。ただし、遅延展開が有効になっている場合、 が展開され!たときに値が破損するため、タイトル値のいずれかが含まれていると問題が発生します。%%b

タイトルに含まれている可能性がある場合は!、2 番目のループ内で遅延拡張のオンとオフを切り替える必要があります。Lただし、ENDLOCALの後の値を保持する必要があります。次のようなことができます。

For /F "delims=" %%b in (%XDRV%%XPATH%%%a\1dir%%a.txt) do (
  set XTITLE=%%b
  setlocal enableDelayedExpansion
  :: ... do your work with delayed expansion
  :: Use a FOR loop to transport the value of L past ENDLOCAL
  for %%N in (!L!) do (
    endlocal
    set "L=%%N"
  )
):: End For #2
于 2013-01-21T03:38:52.270 に答える