Question

Y at-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 fais cela directement, il bloque PowerShell jusqu'à ce que je ferme Emacs. Mais en utilisant tente Start-Job pour exécuter Emacs de mon répertoire, ayant ainsi Emacs ouvrir un nouveau fichier au lieu de celui que je voulais.

J'ai essayé de spécifier le chemin complet à l'aide pwd $, mais les variables dans le bloc de script ne sont pas résolus jusqu'à ce qu'ils soient d'exécution dans le contexte Start-Job. Donc, d'une certaine façon de forcer la résolution des variables dans le contexte de la coquille serait également une réponse acceptable à ce sujet.

Alors, voici ce que j'ai essayé, juste pour être complet:

Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
Était-ce utile?

La solution

Une solution possible serait de créer un "kicker-script":

Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"

Votre script ressemblerait à ceci:

Set-Location $args[0]
emacs $args[1]

Hope this helps.

Autres conseils

Il y a belle solution de de poste un mec . Suggère d'utiliser ommenter paramètre Init répertoire de travail de configuration du bloc de script.

function start-jobhere([scriptblock]$block) {
    Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}

Pour résumer le problème:

  • Un travail de fond a commencé avec Start-Job ne pas possèdes l'emplacement actuel (répertoire de travail).

    • Par défaut, elle $HOME\Documents dans Windows PowerShell et $HOME dans PowerShell de base (en PSv5.1 / PSv6 alpha).

    • Si vous utilisez PowerShell Tore et vous ciblez un fichier dans le courant , vous pouvez utiliser la suivant, car le répertoire nouvelle syntaxe ... & par défaut exécute le travail dans le courant :
      emacs RandomFile.txt &

  • Vous ne pouvez pas directement variables de référence de la courant session dans un bloc de script est passé à Start-Job.

Pour compléter propre réponse utile de jdmichal et réponse utile de asavartsov , qui fonctionnent encore bien:

PSV3 introduit un moyen simple de faire référence à la courant variables de session dans un bloc de script qui est exécuté dans un contexte différent (comme un travail de fond ou sur une machine distante), via la portée de $using::

Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }

Vous pouvez également:

Start-Job { emacs $using:PWD/RandomFile.txt }

Note:

  • 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 numéro GitHub signale l'incapacité étonnante à utiliser $using: dans le script bloc passé à -InitializationScript, même si cela fonctionne dans le bloc principal de script (le paramètre -ScriptBlock implicite).

    • Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS

essayer

Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }

Ici $input est variable prédéfini qui tient à l'intérieur de la valeur de paramètre de -inputobject

Start-Job est un surpuissant pour ce que vous avez besoin (d'exécuter une commande en arrière-plan). Utilisez Démarrage processus à la place:

Start-Process -NoNewWindow emacs RandomFile.txt

Il n'y a pas de problème avec le répertoire en cours dans cette approche. J'ai aussi créé une fonction pour ce aussi simple que possible:

function bg() {Start-Process -NoNewWindow @args}

et l'invocation devient:

bg emacs RandomFile.txt

Cela fonctionne sous Windows 7 (Powershell v2).

Juste pour être complet, voici le script final je mis en œuvre en fonction de la réponse de Filburt, style wiki communautaire:

function Start-Emacs ( [string]$file )
{
    Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top