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/

ScriptBlock ではなく、FilePath パラメーターを使用するために、次のように変更しました。

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 に答える