2

我正在使用以下命令开始 PowerShell 作业:

start-job -filename my_script.ps1 -argumentlist ($v1, $v2, $v3)

然而,这个脚本需要知道它的位置,因为它会根据相对于它的位置运行其他命令。当直接从提示符运行时,这些结构可以工作:

join-path (split-path (& { $myinvocation.scriptname })) "relative path\filename"
join-path (split-path $myinvocation.mycommand.definition) "relative path\filename"

然而,当作为第一个示例中的工作开始时,这根本不起作用。当我开始工作时,如何确定我从哪里开始?

4

2 回答 2

2

这似乎就像文件作为脚本块传递到作业中的远程处理情况一样,因此脚本来自哪个文件的概念会丢失。您也可以通过路径(尽管这似乎不太理想):

PS> gc .\job.ps1
param($scriptPath)
"Running script $scriptPath"
PS> $job = Start-Job -FilePath .\job.ps1 -ArgumentList $pwd\job.ps1
PS> Wait-Job $job

Id  Name            State      HasMoreData     Location  Command
--  ----            -----      -----------     --------  -------
13  Job13           Completed  True            localhost param($scriptPath)...


PS> Receive-Job $job.id
Running script C:\Users\hillr\job.ps1
于 2010-11-20T00:12:06.130 回答
0

更新:

我遇到了这个代码示例:

http://blog.brianhartsock.com/2010/05/22/a-better-start-job-cmdlet/

为了使用 FilePath 参数,我没有使用 ScriptBlock,而是将其修改为:

param([string]$file)

$filePath = split-path $file -parent
Start-Job -Init ([ScriptBlock]::Create("Set-Location $filePath")) -FilePath $file -ArgumentList $args

这将被称为:

Start-JobAt c:\full_path\to\file\my_script.ps1 ($v1, $v2, $v3)

使用 -Init (-InitializationScript) 并触发 Set-Location 将当前执行进程移动到脚本的目录,因此,您可以从那里确定相对位置。

正如博客文章所提到的,您可以将其作为外部脚本(我将我的测试为 Start-JobAt.ps1)或将其作为您的用户/服务帐户配置文件的一部分。

于 2010-11-19T18:39:20.407 回答