>백엔드 개발 >C++ >C#에서 호출할 때와 직접 호출할 때 %~dp0 배치 파일 경로가 다르게 작동하는 이유는 무엇입니까?

C#에서 호출할 때와 직접 호출할 때 %~dp0 배치 파일 경로가 다르게 작동하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-09 21:51:42232검색

Why Does the %~dp0 Batch File Path Act Differently When Called from C# vs. Directly?

배치 파일 경로 참조(%~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# 실행의 경우:

  • 인용 금지: 가장 간단한 해결책은 C#에서 배치 파일을 호출할 때 따옴표를 사용하지 않는 것입니다. cmd /c batchfile.cmd 대신 "cmd /c "batchfile.cmd"과 같은 명령을 사용하세요.
  • 전체 경로 사용: 따옴표를 사용해야 하는 경우 항상 C# 호출에서 배치 파일의 전체 경로를 제공하세요. 이렇게 하면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.