2

forループで尋ねられた他の質問の1つからの手法を使用して、ファイルの親ディレクトリを取得することに取り組んできました。私のスクリプトは、複数のファイルの場所に対して実行するために必要な 1 つのパラメーターを既に取り込んでいるので、それを保持する必要があると思います。私の getparentdir goto には、パラメーターを操作する何らかの方法が必要です。同じ親ディレクトリ内の複数のディレクトリのファイルに対してそれを行う必要があります。どんな助けでも素晴らしいでしょう。

私がそれを実行すると、スクリプトに送信されるものではなく、スクリプトのパラメーターが優先されるように見えるため、GOTO何も行われません。

setlocal ENABLEDELAYEDEXPANSION

for /D %%f in (F:\Falcon\Inbound\%1\*) do (

    for %%g in ("%%f\*.PDF") do (
      set ParentDir="%%g"
      echo !ParentDir!
      set ParentDir=%ParentDir: =:%
      set ParentDir=%ParentDir:\= %


      :getparentdir
      if "%~1" EQU "" goto :cont
      Set ParentDir=%~1
      shift
      goto :getparentdir
      call :getparentdir


      :cont 
      set ParentDir=%ParentDir::= %
      echo ParentDir is !ParentDir!

    )
)
4

2 に答える 2

1

あなたが何をしようとしているのか理解できません。しかし、あなたの質問のコードには多くの問題があります。

1) DO() ブロック内で ParentDir を設定し、遅延拡張を適切に使用して、設定された値を ECHO します。しかし、後で同じコード ブロック内で、検索と置換を実行するために誤って通常の展開に戻ってしまいます。コード ブロック全体で遅延展開を使用する必要があります。例:
set ParentDir=!ParentDir: =:!.

2) GOTO の後に CALL があります。もちろん、GOTO がバイパスするため、CALL は決して実行できません。それはおそらく同じです。

3) FOR ループ内で GOTO を実行しようとしました。これにより、すぐにループが中断され、ロジックが意図したものと異なる可能性が高くなります。ループは 1 つ以上の PDF ファイルを処理することはありません。また、括弧で囲まれたコードの DO ブロック内のラベルに GOTO しようとしています。通常、コード ブロック内にラベルを配置しないでください。コードの IF ステートメント ブロックに関する同様の問題については、(Windows バッチ) Goto within if ブロックが非常に奇妙な動作をするを参照してください。

于 2012-10-30T16:38:02.373 に答える
0

外側の for ループに値を与えるだけで実現しました

   for /D %%f in (F:\Falcon\Inbound\%1\*) do (

      SET ParentDir = %%~nf

      for %%g in ("%%f\*.PDF") do (

         rem - Do Code here
      )
   )

forループが必要な場合でも、これはまったく同じように機能します。突然の明晰さ。

于 2012-10-30T13:33:27.933 に答える