배치 파일 경로 참조(%~dp0) 불일치 이해
배치 파일에서 %~dp0
의 동작은 배치 파일이 실행되는 방식에 따라, 특히 직접 실행과 C# 프로그램 실행을 비교할 때 달라질 수 있습니다. 이러한 차이점은 cmd.exe
이 %~0
변수와 해당 수정자를 처리하는 방식에서 발생합니다.
문제:
다음 줄이 포함된 배치 파일을 고려해 보세요.
<code class="language-batch">echo %~dp0 cd Arvind echo %~dp0</code>
직접 실행하는 경우 디렉터리를 "Arvind"로 변경해도 %~dp0
의 출력에는 영향을 미치지 않습니다. 그러나 이 동일한 배치 파일이 C# 프로그램에서 호출되는 경우 두 번째 echo %~dp0
새 디렉터리("Arvind")가 반영됩니다.
근본 원인:
핵심 문제는 cmd.exe
의 %~0
해석에 있습니다. %~0
변수는 ~d
(드라이브 문자) 및 ~p
(경로)와 같은 수정자와 함께 현재 실행 중인 배치 파일의 내부 표현에 있는 정보에 액세스합니다.
중요한 차이점은 인용이 내부 참조에 미치는 영향입니다. %~0
에 따옴표가 없으면 내부 참조가 배치 파일의 전체 경로를 올바르게 가리키는 것입니다. 그러나 배치 파일에 대한 호출이 따옴표로 묶인 경우(C# 상호 작용에서 일반적임) cmd.exe
는 따옴표를 제거하여 잠재적으로 절대 경로 대신 상대 경로 해석으로 이어질 수 있습니다. 이 상대 경로 해석은 현재 작업 디렉터리에 따라 변경됩니다.
해결책:
C# 실행의 경우:
cmd /c batchfile.cmd
대신 "cmd /c "batchfile.cmd"
과 같은 명령을 사용하세요.cmd.exe
이 작업 디렉터리에 관계없이 올바른 절대 경로를 갖게 됩니다.배치 파일 실행의 경우:
<code class="language-batch">@echo off setlocal enableextensions disabledelayedexpansion call :getCurrentBatchPath myBatchPath echo %myBatchPath% cd Arvind echo %myBatchPath% exit /b :getCurrentBatchPath set "%~1=%~f0" goto :eof</code>
이 서브루틴은 %~f0
(항상 전체 경로 제공)을 사용하여 지정된 변수(이 예에서는 myBatchPath
)에 경로를 저장합니다. 그러면 디렉토리를 변경한 후에도 변수는 일관되게 유지됩니다.
위 내용은 C#에서 호출할 때와 직접 호출할 때 %~dp0 배치 파일 경로가 다르게 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!