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" }
23
demandé sur JasonMArcher 2010-02-08 22:42:22

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.

14
répondu Filburt 2010-02-11 18:08:08

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
}
20
répondu asavartsov 2017-05-29 11:09:46

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

6
répondu Ritesh 2012-12-06 21:30:25

, 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 commande Start-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
5
répondu mklement0 2017-08-08 21:40:01

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).

4
répondu Bogdan Calmac 2012-12-05 17:25:30

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] }
}
2
répondu jdmichal 2010-02-17 18:51:05