Interpret Variable in Powershell { } scriptblock

2019-07-20 10:55发布

问题:

I have a shell script which should start a .exe in the background:

$strPath = get-location
$block = {& $strPath"\storage\bin\storage.exe" $args}
start-job -scriptblock $block -argumentlist "-f", $strPath"\storage\conf\storage.conf"

In a preceding Question I found out that I need absolute Paths. However the $strPath variable isn't interpreted, if you look at the command:

PS Q:\mles\etl-i_test> .\iprog.ps1 --start1
Start Storage

Id              Name            State      HasMoreData     Location             Command
--              ----            -----      -----------     --------             -------
37              Job37           Running    True            localhost            & $strPath"\storage\bi...

How can I fix this?

Edit: I understand I need to pass the path as an argument, and how? Something like:

$block = {& $args[0]"\storage\bin\storage.exe" $args[1] $args[2]}
start-job -scriptblock $block -argumentlist $strPath, "-f", $strPath"\storage\conf\storage.conf"

?

回答1:

The contents of the script block will be executed in another instance of PowerShell.exe (as the job) which won't have access to your variables. This is why you need to send them in the Start-Job argumentlist. Send all the data the job will need to function as an argument. The full path to storage.exe for example, e.g.

$path = (Get-Location).Path
$block = {& $args[0] $args[1] $args[2]}

start-job -scriptblock $block -argumentlist `
    "$path\storage\bin\storage.exe" `
    "-f", `
    "$path\storage\conf\storage.conf"