Hacer que PowerShell asuma el directorio de trabajo de un archivo por lotes llamado

Hacer que PowerShell asuma el directorio de trabajo de un archivo por lotes llamado

Trabajo regularmente de forma interactiva con un script por lotes que no puedo cambiar fácilmente. Una de las características de este script es como ayuda para la navegación: comprende las convenciones de diseño del código de mi empresa/producto y utiliza ese conocimiento para convertir "theScript cdTestCode" en "cd /DC:\The\Inferred\Path\To\The\Unit". \Tests" para el componente en cuyo directorio me encuentro actualmente. Es un gran ahorro de tiempo.

Me gustaría poder utilizar este script desde un entorno interactivo de PowerShell. Para la mayoría de sus funciones, simplemente llamar al script desde PowerShell funciona bien. Pero para esa función de navegación, el cambio de directorio que realiza solo afecta el entorno cmd en el que PowerShell ejecuta el script por lotes. El directorio del host de PowerShell circundante no cambia, lo que significa que no me resulta muy útil cuando lo intento. para usar PowerShell como mi shell.

Entonces mi pregunta es:Suponiendo que no puedo cambiar el script por lotes(y que no quiero reescribirlo como un script de PowerShell), ¿hay alguna buena manera de propagar el directorio de trabajo final del script por lotes al host de PowerShell al finalizar el script por lotes? Es decir, ¿existe algún medio razonablemente sencillo para escribir una función?

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 preguntaes muy similar, pero la "solución" que presenta es simplemente cambiar el archivo por lotes a un script .ps1. El script por lotes con el que estoy trabajando es muy complejo; hacerlo requeriría una reescritura significativa, lo cual preferiría evitar.

Respuesta1

Terminé siguiendo la sugerencia de @dangph.

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

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

Además, Lee Holmes escribió un guión que resuelve básicamente el mismo problema en 2006:http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/

información relacionada