PowerShell / PowerShell/PowerShell

Start-Job -InitializationScript should support $using: variable references too

Offen
#4,530 9 Kommentare 11 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Issue-Bug KeepOpen Up-for-Grabs WG-Cmdlets WG-NeedsReview
Vorherrschende Sprache
C#
Sterne
55.5k
Forks
8.5k
Ø Merge
1 T. 2 Std.
Gemergte PRs (30 T.)
88

Beschreibung

Note:

  • The bug equally affects Start-ThreadJob.

In the script block passed to the (implied as the 1st positional) -ScriptBlock parameter of Start-Job, it is possible to reference variables from the calling scope via the $using: scope; e.g.:

# Make the background job's working directory the same as the calling session's and
# print the then-current location.
Start-Job { Set-Location $using:PWD; $PWD } | Receive-Job -Wait -AutoRemove

By contrast, the following - even though I'd expect it to be equivalent - does NOT work, because the $using: reference is in the -InitializationScript script block:

Start-Job -InitializationScript { Set-Location $using:PWD }  { $PWD } | Receive-Job -Wait -AutoRemove

Invocation fails with the following error messages:

A Using variable cannot be retrieved. A Using variable can be used only with 
Invoke-Command, Start-Job, or InlineScript in the script workflow. When it is used with
Invoke-Command, the Using variable is valid only if the script block is invoked on
a remote computer.
....

Note that the above command would be the cleanest workaround for not having a -WorkingDirectory parameter (see #4287) to set the working directory explicitly.

Both script blocks execute in the job's session, so they should both support $using: variable references.

Environment data

PowerShell Core v6.0.0-beta.5 on macOS 10.12.6
PowerShell Core v6.0.0-beta.5 on Ubuntu 16.04.3 LTS
PowerShell Core v6.0.0-beta.5 on Microsoft Windows 10 Pro (64-bit; v10.0.15063)
Windows PowerShell v5.1.15063.483 on Microsoft Windows 10 Pro (64-bit; v10.0.15063)

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere die beiden Befehle mit Start-Job und Start-ThreadJob und vergleiche das Verhalten von $using: in -ScriptBlock und -InitializationScript. Verfolge die Einstiegspunkte der Jobinitialisierung in der PowerShell-Implementierung; abgeschlossen ist die Aufgabe, wenn beide Scriptblöcke $using:-Referenzen aus dem aufrufenden Gültigkeitsbereich ohne den gemeldeten Fehler auflösen können.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
csharp, powershell
Bereich
cli
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.