我正在使用以下命令启动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"
然而,当作为第一个示例中的作业启动时,这根本不起作用。当我开始工作时,如何确定我的工作地点?
答案 0 :(得分: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
答案 1 :(得分: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进行测试)或将其作为用户/服务帐户配置文件的一部分。