2

私は次のようなフォルダを持っていますE:\Backups\code\Hazard\test1...testn

そして、これらのテストフォルダー内には、次のようなものがありE:\Backups\code\Hazard\test1\it0ます...itn

ルート フォルダーはE:\Backups\code、コードが実行される場所です。

summary.yml以下のコードは、各サブフォルダーで実行され、フォルダーからit0最新のフォルダーにコピーされit(n)ます。

コードがtest1フォルダーに対してのみ実行され、ハングするのはなぜですか?

setlocal ENABLEDELAYEDEXPANSION

set root=%cd%
for /D %%X in (%root%\*) do (
    echo %%X
    cd  %%X

    for /D /r %%b in (*) do ( 
        cd  %%b

        echo %%b

        for /f "tokens=1,2,*" %%a in ('robocopy . . file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs ^| sort /r') do set "lastFolder=%%~dpc" & goto :done
:done
        echo Last folder : %lastFolder%

        for /d    %%j in (*) do  (
            if /i "%%~nj"=="it0" COPY %%j\summary.yml %lastFolder% 
        )
        cd ..
    )
)
4

2 に答える 2

1

コードには 2 つの主な問題があります。

  • をループ内gotoで使用するforと、ループがキャンセルされます
  • コード ブロック (括弧内のコード) 内に変数を設定する場合、同じコード ブロック内の変数の値を取得するには、遅延展開が必要ですsetlocal enabledelayedexpansion%var%!var!

しかし

  • 前の回答goto示されているように削除できます。
  • 遅延拡張は必要ありません。for置換可能なパラメータの値を変数内に格納する代わりに、置換可能なパラメータを使用するだけです

テストされていませんが、多かれ少なかれ

@echo off
    setlocal enableextensions disabledelayedexpansion

    rem E:\Backups\ code   \  Hazard \ test1 \ it0 ... itn
    rem             ^root     ^ %%X    ^ %%Y           ^ %%~dpc

    for /D %%X in ("*") do for /D %%Y in ("%%~fX\*") do for /f "tokens=1,2,*" %%a in ('
        robocopy "%%~fY." "%%~fY." file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs 
        ^| sort /r 2^>nul
        ^| cmd /q /v /c "(set /p .=&echo(!.!)"
    ') do copy "%%~fY\it0\summary.yml" "%%~dpc."

現在のActive E:\Backups\codeDirectory であること:

  • %%XE:\Backups\code( Hazard)の下のフォルダーを列挙します
  • %%YE:\Backups\code\Hazard( testn)の下のフォルダーを列挙します
  • %%aコマンドを実行して、最新のファイルrobocopyを含むフォルダーを見つけますfile.txt
  • sort /rファイルのリストを降順でソートし、最新のファイルがリストの最初になるようにします
  • cmd最初の行のみを取得して出力します
  • いくつかのfor置き換え可能なパラメータで利用可能なすべての情報を使用して、指定されたcopyコマンドを実行します。
于 2015-10-26T21:37:55.903 に答える
1

robocopyを含む行が何をすべきかわかりません。このコマンドは、現在のディレクトリの最後のサブディレクトリの名前を取得するためのもののようです。

おそらく、このコードの方がうまく機能します。しかし、私はそれをテストできませんでした。

setlocal EnableDelayedExpansion
set "root=%cd%"

for /D %%X in ("%root%\*") do (
    echo %%X
    cd "%%~X"

    for /D /r %%b in (*) do (
        cd "%%~b"
        echo %%b

        call :GetLastFolder

        echo Last folder : !lastFolder!

        for /d %%j in (*) do (
            if /i "%%~nj"=="it0" copy "%%j\summary.yml" "!lastFolder!"
        )
        cd ..
    )
)
goto :EOF

:GetLastFolder
for /f "tokens=1,2,*" %%a in ('robocopy . . file.txt /l /nocopy /is /s /nc /ns /ts /ndl /njh /njs ^| sort /r') do set "lastFolder=%%~dpc" & goto :EOF
goto :EOF

ここで必要に応じて遅延展開を実際に使用するには、少なくともlastFolderパーセント記号の代わりに感嘆符を使用して環境変数を参照する必要があります。

goto :EOFサブルーチンを終了し、以下の行に進みますcall :GetLastFolder

ほとんどの外側の forループが終了した後にサブルーチンのコードがもう一度実行されることを避けるために必要なメイン コードの後に​​、もう 1 つgoto :EOFまたは代わりに 1 つがあります。これにより、このバッチ ファイルの処理が終了します。exit /Bgoto :EOF

使用するコマンドとその動作を理解するには、コマンド プロンプト ウィンドウを開き、少なくとも次のコマンドを実行し、各コマンドで表示されるすべてのヘルプ ページを注意深く読んでください。

  • call /?
  • for /?
  • goto /?
  • set /?
于 2015-10-26T21:10:53.743 に答える