2 votes

Faire en sorte que PowerShell prenne en compte le répertoire de travail d'un fichier Batch appelé

Je travaille régulièrement de manière interactive avec un script batch que je ne peux pas facilement modifier. Ce script sert notamment d'aide à la navigation - il comprend les conventions de présentation du code de mon entreprise/produit et utilise cette connaissance pour transformer "theScript cdTestCode" en "cd /D C:\The\Inferred\Path\To\The\Unit\Tests "pour le composant dans le répertoire duquel je me trouve. C'est un excellent moyen de gagner du temps.

J'aimerais pouvoir utiliser ce script à partir d'un environnement PowerShell interactif. Pour la plupart des fonctionnalités, l'appel du script à partir de PowerShell fonctionne parfaitement. Mais pour cette fonction de navigation, le changement de répertoire qu'elle effectue n'affecte que l'environnement cmd dans lequel PowerShell exécute le script par lots. Le répertoire de l'hôte PowerShell environnant n'est pas modifié, ce qui signifie que ce n'est pas très utile pour moi lorsque j'essaie d'utiliser PowerShell comme mon script.

Ma question est donc la suivante : En supposant que je ne puisse pas modifier le script du lot. (et que je ne veux pas le réécrire en tant que script PowerShell), existe-t-il un bon moyen de propager le répertoire de travail final du batch script vers l'hôte PowerShell à la fin du batch script ? En d'autres termes, existe-t-il un moyen raisonnablement simple d'écrire une fonction :

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

tel que

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

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

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

Cette question est très similaire, mais la "solution" qu'il présente consiste simplement à transformer le fichier batch en un script .ps1. Le fichier batch script avec lequel je travaille est très complexe - faire cela nécessiterait une réécriture importante, ce que je préfère éviter.

0voto

Dan Bjorge Points 121

J'ai fini par suivre la suggestion 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

Pour l'anecdote, Lee Holmes a écrit un script qui résout essentiellement le même problème en 2006 : http://www.leeholmes.com/blog/2006/05/11/nothing-solves-everything-%e2%80%93-powershell-and-other-technologies/

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X