
Trabalho regularmente de forma interativa com um script em lote que não consigo alterar facilmente. Um dos recursos deste script é como um auxílio à navegação - ele entende as convenções de layout de código da minha empresa/produto e usa esse conhecimento para transformar "theScript cdTestCode" em "cd /DC:\The\Inferred\Path\To\The\Unit \Tests" para o componente cujo diretório estou atualmente. É uma ótima economia de tempo.
Gostaria de poder usar esse script em um ambiente interativo do PowerShell. Para a maioria dos recursos, apenas chamar o script no PowerShell funciona perfeitamente. Mas para esse recurso de navegação, a alteração de diretório executada afeta apenas o ambiente cmd no qual o PowerShell executa o script em lote. O diretório do host do PowerShell ao redor não é alterado, o que significa que não é muito útil para mim quando estou tentando para usar o PowerShell como meu shell.
Então minha pergunta é:Supondo que não consigo alterar o script em lote(e não quero reescrevê-lo como um script do PowerShell), existe alguma boa maneira de propagar o diretório de trabalho final do script em lote de volta ao host do PowerShell na conclusão do script em lote? Ou seja, existe um meio razoavelmente simples de escrever uma função:
function InvokeBatchScriptAndAssumeDirectory($BatchScriptFullName) {
# ...
}
de tal modo que
PS> pwd
Path
----
C:\elsewhere
PS> echo .\mybatchscript.cmd
@ECHO OFF
cd /D C:\
PS> InvokeBatchScriptAndAssumeDirectory .\mybatchscript.cmd
PS> pwd
Path
----
C:\
Essa questãoé muito semelhante, mas a "solução" que apresenta é apenas alterar o arquivo em lote para um script .ps1. O script em lote com o qual estou trabalhando é muito complexo - isso exigiria uma reescrita significativa, o que prefiro evitar.
Responder1
Acabei seguindo a sugestão do @dangph.
Param([string]$Script, [string]$ScriptParams)
$WorkingDirectoryTempFile = [IO.Path]::GetTempFileName()
cmd /c " `"$Script`" $ScriptParams && cd > `"$WorkingDirectoryTempFile`" "
Get-Content $WorkingDirectoryTempFile | Set-Location
Remove-Item $WorkingDirectoryTempFile
À parte, Lee Holmes escreveu um roteiro que resolve basicamente o mesmo problema em 2006:http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/