PowerShell이 ​​호출된 배치 파일의 작업 디렉터리를 가정하도록 만들기

PowerShell이 ​​호출된 배치 파일의 작업 디렉터리를 가정하도록 만들기

나는 쉽게 변경할 수 없는 배치 스크립트를 사용하여 정기적으로 대화형으로 작업합니다. 이 스크립트의 기능 중 하나는 탐색 보조 기능입니다. 이는 내 회사/제품의 코드 레이아웃 규칙을 이해하고 해당 지식을 사용하여 "theScript cdTestCode"를 "cd /DC:\The\Inferred\Path\To\The\Unit"으로 변환합니다. 현재 디렉토리가 있는 구성 요소에 대한 "\Tests"입니다. 시간을 크게 절약할 수 있습니다.

대화형 PowerShell 환경 내에서 이 스크립트를 사용할 수 있기를 원합니다. 대부분의 많은 기능의 경우 PowerShell 내에서 스크립트를 호출하는 것만으로도 문제가 없습니다. 그러나 해당 탐색 기능의 경우 수행되는 디렉터리 변경은 PowerShell이 ​​배치 스크립트를 실행하는 cmd 환경에만 영향을 미칩니다. 주변 PowerShell 호스트의 디렉터리는 변경되지 않으므로 시도할 때 별로 유용하지 않습니다. PowerShell을 내 셸로 사용합니다.

그래서 내 질문은 다음과 같습니다배치 스크립트를 변경할 수 없다고 가정(그리고 이를 PowerShell 스크립트로 다시 작성하고 싶지 않습니다.) 배치 스크립트 완료 시 배치 스크립트의 최종 작업 디렉터리를 PowerShell 호스트에 다시 전파할 수 있는 좋은 방법이 있습니까? 즉, 함수를 작성하는 합리적으로 간단한 방법이 있습니까?

function InvokeBatchScriptAndAssumeDirectory($BatchScriptFullName) {
    # ...
}

그렇게

PS> pwd
Path
----
C:\elsewhere

PS> echo .\mybatchscript.cmd
@ECHO OFF
cd /D C:\

PS> InvokeBatchScriptAndAssumeDirectory .\mybatchscript.cmd
PS> pwd
Path
----
C:\

이 질문매우 유사하지만 제시된 "솔루션"은 배치 파일을 .ps1 스크립트로 변경하는 것입니다. 제가 작업하고 있는 배치 스크립트는 매우 복잡합니다. 그렇게 하려면 상당한 재작성이 필요하므로 저는 이를 피하고 싶습니다.

답변1

결국 @dangph의 제안을 따르게 되었습니다.

Param([string]$Script, [string]$ScriptParams)

$WorkingDirectoryTempFile = [IO.Path]::GetTempFileName()
cmd /c " `"$Script`" $ScriptParams && cd > `"$WorkingDirectoryTempFile`" "
Get-Content $WorkingDirectoryTempFile | Set-Location
Remove-Item $WorkingDirectoryTempFile

여담이지만 Lee Holmes는 2006년에 기본적으로 동일한 문제를 해결하는 스크립트를 작성했습니다.http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/

관련 정보