문제

나는있다 .bat 스크립트 시작 a java 프로그램. 그만큼 java 프로그램은 폴더를 삭제합니다 .bat 앉는다. 나는 만질 방법이 없습니다 java 프로그램. 나는 만 수정할 수있다 .bat 파일.

문제는 .bat 삭제되면 파일은 마무리하지 않고 즉시 실행을 중지합니다. 그러나 이후에해야 할 몇 가지 정리 작업이 있습니다. java 프로그램 종료.

나는 복사하려고했다 .bat 다른 곳에 제출하고 삭제되지 않는 위치에 발사하십시오. 아아, 한 번 원본 .bat 여전히 실행 중이므로 삭제되면 동일한 충돌이 발생하며 완료되지 않습니다.

다음은 두 가지 샘플 파일입니다 (예제의 목적을 위해 그들이 위치한 척하자. D:\tmp) :

삭제. 바트

echo "delete start"

pause

del launch.bat

pause

echo "delete end"

발사. 바트

echo "launch start"

setlocal enabledelayedexpansion enableextensions 

if "%CD%"=="C:\tmp" (

    echo "in temp"
    d:
    cd \tmp
    delete.bat

)

if "%CD%" NEQ "C:\tmp" (

    echo "not in temp"
    mkdir C:\tmp
    copy launch.bat C:\tmp\launch.bat
    echo "launch copied"
    C:
    cd \tmp
    cmd /c launch.bat

)

echo "launch end"

진수 launch.bat 복사 한 경우 작동합니다 launch.bat 초기와 분리되었습니다.

누구든지 만들 수있는 방법을 알고 있습니까? .bat 실행 중에 삭제 되더라도 실행을 끝내십니까?

도움이 되었습니까?

해결책 4

이렇게하면 더 나은 결과가있는 것 같습니다 (전화 launch.bat ~와 함께 cmd /k) :

발사. 바트

echo "launch start"

setlocal enabledelayedexpansion enableextensions 

if "%CD%"=="C:\tmp" (

        echo "in temp"
        d:
        cd \tmp
        delete.bat
        echo "after delete"
)

if "%CD%" NEQ "C:\tmp" (

        echo "not in temp"
        mkdir C:\tmp
        copy launch.bat C:\tmp\launch.bat
        echo "launch copied"
        C:
        cd \tmp
        cmd /k launch.bat

)

echo "launch end"

이제 나는 도달 할 수 있습니다 echo "after delete", 그러나 나는 어떻게 든 무한 루프로 끝납니다. 이 시점에서 최소한 내 정리를 실행할 수 있습니다. 내가 왜 도달 할 수 없는지 모르겠다 echo "launch end", 그렇지만.

다른 팁

이것은 스크립트가 자체적으로 삭제 한 다음 종료하도록 명령합니다. 라인이 실행되기 전에 명령 통역사가 전체 줄을 읽으므로 파일이 더 이상 존재하지 않더라도 삭제 명령 후에 종료 명령이 실행됩니다.

del /f/q "%~0" | exit

또는 파일이 삭제 된 후 많은 명령을 실행하려는 경우 괄호를 사용할 수 있습니다.

(del /f/q "%~0"
if exist "%~0" (echo.How did that happen?) else (echo.I've deleted myself.)
pause
exit)   

실행 중에 삭제 되더라도 .Bat을 실행하는 방법을 아는 사람이 있습니까?

나는 그것이 가능하지 않다고 생각합니다. 배치 실행 파일에서 직접 읽습니다. 파일을 수정하면 실행이 변경됩니다 (자체 수정 배치 프로그램은 디버그하기가 매우 어렵습니다!)

다른 위치에서 배치 파일을 시작하지 않겠습니까?

그렇게 할 수 없더라도 할 수있는 것은 한 줄만 구성된 파일을 갖는 것이 삭제되지 않는 다른 배치 파일을 호출하는 것입니다. 이 파일은 Java 프로그램을 시작하고, 모든 정리를 수행하고, 원래 배치 파일을 복원하여 여러 번 실행할 수 있도록 모든 것을 수행합니다.

실행하는 대신 a cmd /c launch.bat, 제어가 통화 배치 파일로 다시 전송하려고 시도하면 간단히 수행하여 실행합니다. launch.bat이렇게하면 배치 파일로 제어 (통화 대신 goto로 생각)를 전송하므로 더 이상 존재하지 않는 파일로 컨트롤을 반환하려고하지 않습니다.

삭제 된 파일에서 라인을 실행할 수는 있지만 블록은 실행되기 전에 항상 메모리에 완전히 캐시되므로 라인은 괄호 블록에 상주해야합니다.

분명히 배치에서 기능을 호출 할 수는 없지만 다른 배치 파일을 호출하고 (블록으로) 제어를 다시 가져올 수 있습니다.

@echo off
(
  echo Delete myself
  del %~f0
  call ..\second.bat 
  echo do some other stuff after second.bat
)
echo This line can't be reached anymore
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top