PowerShell Start-Répertoire De Travail Du Travail
Est-il un moyen de spécifier un répertoire de travail à la commande Start-Job?
Cas D'utilisation:
Je suis dans un répertoire, et je veux ouvrir un fichier en utilisant Emacs pour l'édition. Si je le fais directement, il bloquera PowerShell jusqu'à ce que je ferme Emacs. Mais en utilisant Start-Job tente D'exécuter Emacs à partir de mon répertoire personnel, Emacs ouvrant ainsi un nouveau fichier au lieu de celui que je voulais.
J'ai essayé de spécifier le chemin complet en utilisant $pwd, mais les variables du bloc de script ne sont pas résolues avant ils s'exécutent dans le contexte de démarrage. Donc, un moyen de forcer la résolution des variables dans le contexte du shell serait également une réponse acceptable à cela.
Alors, voici ce que j'ai essayé, juste pour l'exhaustivité:
Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
6 réponses
Une solution possible serait de créer une "bosse-script":
Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"
Votre script ressemblerait à ceci:
Set-Location $args[0]
emacs $args[1]
J'espère que cela aide.
Il y a une bonne solution à partir de la section commentaires du post de certains mecs . Le commentateur suggère d'utiliser le paramètre Init
pour configurer le répertoire de travail du bloc de script.
function start-jobhere([scriptblock]$block) {
Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}
Essayez ceci
Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }
Ici $input
est une variable prédéfinie qui prend en interne la valeur du paramètre -inputobject
, Pour résumer le problème:
-
Un travail d'arrière-plan démarré avec
Start-Job
n'hérite pas de l'emplacement actuel (répertoire de travail).Il est par défaut
$HOME\Documents
dans Windows PowerShell, et$HOME
dans PowerShell Core (à partir de psv5. 1 / psv6 alpha).Si vous utilisez PowerShell Core et vous ciblez un fichier dans le répertoire courant, Vous pouvez utiliser ce qui suit, car nouveaux
... &
syntaxe par défaut exécute le travail dans le actuelle répertoire:emacs RandomFile.txt &
Vous ne pouvez pas directement référencer des variables de la session en cours dans un bloc de script passé à
Start-Job
.
Pour compléter la réponse utile de jdmichal et la réponse utile de asavartsov , qui fonctionnent toujours bien:
PSv3 a introduit un moyen simple de référencer le courant variables de session dans un bloc de script exécuté dans un contexte différent (en arrière-plan ou sur une machine distante), via la portée $using:
:
Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }
Alternativement:
Start-Job { emacs $using:PWD/RandomFile.txt }
Remarque:
-
Ce problème GitHub propose d'ajouter un
-WorkingDirectory
à l'applet de commandeStart-Job
.Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
-
Ce problème GitHub signale l'incapacité surprenante d'utiliser
$using:
dans le bloc de script passé à-InitializationScript
, même bien que cela fonctionne dans le bloc de script principal (le paramètre implicite-ScriptBlock
).Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS
Start-Job est un excès de ce dont vous avez besoin (en exécutant une commande en arrière-plan). Utilisez Start-Process à la place:
Start-Process -NoNewWindow emacs RandomFile.txt
Il n'y a pas de problème avec le répertoire courant dans cette approche. J'ai également créé une fonction pour rendre cela aussi simple que possible:
function bg() {Start-Process -NoNewWindow @args}
, puis l'invocation devient:
bg emacs RandomFile.txt
Cela fonctionne sur Windows 7 (Powershell v2).
Juste pour être complet, voici le script final que j'ai implémenté basé sur la réponse de Filburt, community-wiki style:
function Start-Emacs ( [string]$file )
{
Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}