
나는 쉽게 변경할 수 없는 배치 스크립트를 사용하여 정기적으로 대화형으로 작업합니다. 이 스크립트의 기능 중 하나는 탐색 보조 기능입니다. 이는 내 회사/제품의 코드 레이아웃 규칙을 이해하고 해당 지식을 사용하여 "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/