mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Updated background invocation & operator to use -WorkingDirectory when starting a new job (#16180)
This commit is contained in:
@@ -531,12 +531,8 @@ namespace System.Management.Automation
|
||||
var pipelineOffset = pipelineAst.Extent.StartOffset;
|
||||
var variables = pipelineAst.FindAll(static x => x is VariableExpressionAst, true);
|
||||
|
||||
// Used to make sure that the job runs in the current directory
|
||||
const string cmdPrefix = @"Microsoft.PowerShell.Management\Set-Location -LiteralPath $using:pwd ; ";
|
||||
|
||||
// Minimize allocations by initializing the stringbuilder to the size of the source string + prefix + space for ${using:} * 2
|
||||
System.Text.StringBuilder updatedScriptblock = new System.Text.StringBuilder(cmdPrefix.Length + scriptblockBodyString.Length + 18);
|
||||
updatedScriptblock.Append(cmdPrefix);
|
||||
// Minimize allocations by initializing the stringbuilder to the size of the source string + space for ${using:} * 2
|
||||
System.Text.StringBuilder updatedScriptblock = new System.Text.StringBuilder(scriptblockBodyString.Length + 18);
|
||||
int position = 0;
|
||||
|
||||
// Prefix variables in the scriptblock with $using:
|
||||
@@ -568,14 +564,25 @@ namespace System.Management.Automation
|
||||
var sb = ScriptBlock.Create(updatedScriptblock.ToString());
|
||||
var commandInfo = new CmdletInfo("Start-Job", typeof(StartJobCommand));
|
||||
commandProcessor = context.CommandDiscovery.LookupCommandProcessor(commandInfo, CommandOrigin.Internal, false, context.EngineSessionState);
|
||||
var parameter = CommandParameterInternal.CreateParameterWithArgument(
|
||||
|
||||
var workingDirectoryParameter = CommandParameterInternal.CreateParameterWithArgument(
|
||||
parameterAst: pipelineAst,
|
||||
"ScriptBlock",
|
||||
null,
|
||||
parameterName: "WorkingDirectory",
|
||||
parameterText: null,
|
||||
argumentAst: pipelineAst,
|
||||
sb,
|
||||
false);
|
||||
commandProcessor.AddParameter(parameter);
|
||||
value: context.SessionState.Path.CurrentLocation.Path,
|
||||
spaceAfterParameter: false);
|
||||
|
||||
var scriptBlockParameter = CommandParameterInternal.CreateParameterWithArgument(
|
||||
parameterAst: pipelineAst,
|
||||
parameterName: "ScriptBlock",
|
||||
parameterText: null,
|
||||
argumentAst: pipelineAst,
|
||||
value: sb,
|
||||
spaceAfterParameter: false);
|
||||
|
||||
commandProcessor.AddParameter(workingDirectoryParameter);
|
||||
commandProcessor.AddParameter(scriptBlockParameter);
|
||||
pipelineProcessor.Add(commandProcessor);
|
||||
pipelineProcessor.LinkPipelineSuccessOutput(outputPipe ?? new Pipe(new List<object>()));
|
||||
|
||||
|
||||
@@ -178,7 +178,7 @@ Describe "Debug-job test" -Tag "Feature" {
|
||||
}
|
||||
}
|
||||
|
||||
Describe "Ampersand background test" -Tag "CI","Slow" {
|
||||
Describe "Ampersand background test" -Tag "CI", "Slow" {
|
||||
Context "Simple background job" {
|
||||
AfterEach {
|
||||
Get-Job | Remove-Job -Force
|
||||
@@ -218,6 +218,16 @@ Describe "Ampersand background test" -Tag "CI","Slow" {
|
||||
$j = Get-Location | ForEach-Object -MemberName Path &
|
||||
Receive-Job -Wait $j | Should -Be ($PWD.Path)
|
||||
}
|
||||
It "Make sure Set-Location is not used in the job's script block to set the working directory" {
|
||||
$j = (Get-Variable -Value ExecutionContext).SessionState.PSVariable.Get("MyInvocation").Value.MyCommand.ScriptBlock &
|
||||
(Receive-Job -Wait $j).ToString() | Should -BeExactly "(Get-Variable -Value ExecutionContext).SessionState.PSVariable.Get(`"MyInvocation`").Value.MyCommand.ScriptBlock"
|
||||
}
|
||||
It "Test that changing working directory also changes background job's working directory" {
|
||||
Set-Location ..
|
||||
$WorkingDirectory = (Get-Location).ToString()
|
||||
$BackgroundJob = (Get-Location &)
|
||||
(Receive-Job -Wait $BackgroundJob).ToString() | Should -BeExactly $WorkingDirectory
|
||||
}
|
||||
It "Test that output redirection is done in the background job" {
|
||||
$j = Write-Output hello > $TESTDRIVE/hello.txt &
|
||||
Receive-Job -Wait $j | Should -BeNullOrEmpty
|
||||
|
||||
Reference in New Issue
Block a user