New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Start-Job needs a -WorkingDirectory parameter #4287
Comments
If this gets added, then the language feature |
Would like to see Start-Job have -ThrottleLimit compatibility. |
@Average-Bear: I suggest you create a new issue (and provide a rationale for your request there). |
WorkingDirectory is a property specific to a process - and the fact that Seems like the kind of thing you would want to include in the initialization script, so I'd recommend just fixing #4530 so you can do:
rather than the currently super awkward:
|
I consider Having a You're running a script block / script somewhere, and it's helpful to have a simple way to control that somewhere. This is especially true with the current behavior, where you - invisibly - run in a location other than the current one (unlike when you use the new As an aside, re implementation detail: Understanding the underpinnings of jobs is important, because users need to be aware that a separate process and remoting are involved to understand that deserialized objects are returned. |
I want to take a stab at this one and before deep diving into the implementation I wanted to see what you think about the following solutions:
What do you think? Do any of these approaches seem reasonable? Disclaimer: this is my first issue here so I might be missing something entirely |
@davinci26 I wouldn't inject anything into the script block. That could result in some surprises if/when you debug a job (i.e. you should only see your job script when you debug a job, not extra stuff that your job script didn't include). Instead I'd just set the location when the runspace associated with the job is created, before the script block is run inside of it. |
I took a deep dive at the codebase and I observed the following: Creating a new pipeline with a
|
protected override void CreateHelpersForSpecifiedComputerNames() |
Just add this
var command = new Command("Set-Location");
command.Parameters.Add("LiteralPath", this.WorkingDirectory);
Pipeline tempPipeline = remoteRunspace.CreatePipeline(command.ToString());
tempPipeline.Commands.Add(command);
IThrottleOperation locationOperation = new ExecutionCmdletHelperComputerName(remoteRunspace, tempPipeline);
Operations.Add(locationOperation);
If you follow this approach then pwsh throws because the second operation
in Operations
is trying to open a runspace that is already open (see here)
Is this the intended behaviour? Can we modify the logic when we try to open the remote the runspace to skip the opening if the runspace is already open.
Adding a Set-Location
command to the pipeline
This would require to either:
-
Use the
CreatePipeline
function available inPSRemotingCmdlets
and then insert the command in the beginning. Personally I am not a huge fan of this approach as it would be a bit slow. -
Modify the
CreatePipeline
function directly.
PowerShell/src/System.Management.Automation/engine/remoting/commands/PSRemotingCmdlet.cs
Line 1831 in bd6fdae
internal Pipeline CreatePipeline(RemoteRunspace remoteRunspace) |
This function is consumed by all PSRemoteCmdlets
. Would the workingDirectory parameter make sense in all of them? Is this an overkill?
Changing the working directory of the pwsh remote server:
- The command line argument
workingdirectory
does not work when the pwsh process runs in server mode (-s
flag). - The
InitializationScript
argument is passed to the processstartupInfo
as part of the arguments.
If we stick to the implementation of (1) & (2) I do not see how we could have a workingDirectory
parameter for Start-Job
that would be able to set the working directory also for the InitializationScript
. Is this part of the requirement?
Enabling (1) would allow us to implement the working directory fairly easily since we can add an additional command line argument to when the powershell server process instance is spawned.
🎉This issue was addressed in #10324, which has now been successfully released as Handy links: |
Currently,
Start-Job
:defaults to different, fixed working directories on different platforms (which is problematic in itself):
$HOME
on Unix (macOS, Linux)$HOME\Documents
on Windowsby contrast, using the newly-introduced Unix-like
... &
syntax defaults to the current location; this discrepancy is problematic too [update: but as designed] - see Using postpositional & (control operator) rather than Start-Job results in different current location (working directory) #4267Either way, there is no simple way to have the caller set the working directory explicitly, leading to such painful workarounds as in this SO answer.
The proposed solution:
Environment data
The text was updated successfully, but these errors were encountered: