Background-Job 运行 没有硬编码的脚本

Background-Job run Scripts without hardcoding them

我是运行一个调用不同脚本的PowerShell GUI。我目前正在使用硬编码路径,例如:

function start-jobhere([scriptblock]$block) {
  Start-Job -ArgumentList (Get-Location),$block {
    Set-Location $args[0];
    Invoke-Expression $args[1]
  }
}

$handler_button1_Click = {
  $job1 = start-jobhere {& K:\Uploader\Import\DataUploader.ps1} -Name "Uploader"
}

我试图通过以下方式避免它:

$LocalPath = ($MyInvocation.MyCommand.Path).ToLower().Replace("datauploader.ps1", "")

$handler_button1_Click = {
  $job1 = start-jobhere {& $LocalPath\DataUploader.ps1} -Name "Uploader"
}

但是好像不行。我在同一个文件夹中有一些脚本,有些在不同的硬盘驱动器上。有没有办法避免硬编码路径?

您正在将脚本块传递给函数。脚本块中的代码对脚本其余部分中的变量一无所知,除非您通过 using scope modifier:

让它们为人所知
$job1 = start-jobhere {& "$using:LocalPath\DataUploader.ps1"} -Name "Uploader"

话虽如此,如果您想 运行 编写脚本,为什么不将它们的路径作为字符串传递给您的函数?

function start-jobhere([string]$Name, [string]$Script) {
  Start-Job -Name $Name -ScriptBlock {
    Set-Location $args[0]
    & $args[1]
  } -ArgumentList (Get-Location), $Script
}

$handler_button1_Click = {
  $job1 = start-jobhere "$LocalPath\DataUploader.ps1" -Name "Uploader"
}