Fazendo o PowerShell assumir o diretório de trabalho de um arquivo em lote chamado

2

Trabalho regularmente de forma interativa com um script em lote que não posso alterar com facilidade. Uma das características deste script é como uma ajuda de 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: \ O \ Inferred \ Path \ To \ The \ Unit \ Tests "para o componente cujo diretório eu estou atualmente. É uma ótima economia de tempo.

Gostaria de poder usar esse script em um ambiente interativo do PowerShell. Para a maioria de seus muitos recursos, apenas chamar o script de dentro do PowerShell funciona muito bem. Mas, para esse recurso de navegação, a alteração no diretório que ele executa afeta apenas o ambiente cmd. O PowerShell executa o script em lote. O diretório do host do PowerShell circundante não é alterado, o que significa que não é muito útil quando estou tentando para usar o PowerShell como meu shell.

Portanto, minha pergunta é: Supondo que não posso alterar o script em lote (e que não quero reescrevê-lo como um script do PowerShell), existe uma boa maneira de propagar o trabalho final? diretório do script em lote de volta ao host do PowerShell na conclusão do script em lotes? Ou seja, existe um meio razoavelmente simples de escrever uma função:

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

tal que

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

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

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

Esta questão é muito semelhante, mas a "solução" Ele apresenta apenas para alterar o arquivo em lote em um script .ps1. O script em lote com o qual estou trabalhando é muito complexo - fazer isso exigiria uma reescrita significativa, que eu preferiria evitar.

    
por Dan Bjorge 08.12.2013 / 08:44

1 resposta

0

Acabei indo com 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

Como um aparte, Lee Holmes escreveu um script que resolve basicamente o mesmo problema em 2006: link

    
por 13.01.2014 / 20:17