Skip to content

Commit

Permalink
made background invocation operator use -WorkingDirectory to set work…
Browse files Browse the repository at this point in the history
…ing directory of new job and added a testto ensure background job script block does not use Set-Location to set working directory
  • Loading branch information
ayousuf23 committed Oct 14, 2021
1 parent bd5dc97 commit 412fffa
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
Expand Up @@ -531,12 +531,8 @@ private static string GetParameterText(string parameterName)
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);
System.Text.StringBuilder updatedScriptblock = new System.Text.StringBuilder(scriptblockBodyString.Length + 18);
int position = 0;

// Prefix variables in the scriptblock with $using:
Expand Down Expand Up @@ -568,15 +564,22 @@ private static string GetParameterText(string parameterName)
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,
"WorkingDirectory",
null,
argumentAst: pipelineAst,
context.SessionState.Path.CurrentLocation.Path,
false);
var scriptBlockParameter = CommandParameterInternal.CreateParameterWithArgument(
parameterAst: pipelineAst,
"ScriptBlock",
null,
argumentAst: pipelineAst,
sb,
false);
commandProcessor.AddParameter(parameter);
pipelineProcessor.Add(commandProcessor);
commandProcessor.AddParameter(workingDirectoryParameter);
commandProcessor.AddParameter(scriptBlockParameter);
pipelineProcessor.LinkPipelineSuccessOutput(outputPipe ?? new Pipe(new List<object>()));

context.PushPipelineProcessor(pipelineProcessor);
Expand Down
Expand Up @@ -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
Expand Down Expand Up @@ -218,6 +218,10 @@ 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 output redirection is done in the background job" {
$j = Write-Output hello > $TESTDRIVE/hello.txt &
Receive-Job -Wait $j | Should -BeNullOrEmpty
Expand Down

0 comments on commit 412fffa

Please sign in to comment.