هل هناك أي طريقة لمعرفة ما هو البرنامج النصي الذي يتم تشغيله عندما يبدأ مع اسم الجانبية؟
-
26-09-2019 - |
سؤال
أبدأ وظيفة 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"
هذا لا يعمل على الإطلاق عندما يتم تشغيله كوظيفة كما في المثال الأول ، ولكن. كيف يمكنني تحديد من أين أركض عندما أبدأ كوظيفة؟
المحلول
يبدو أنه يشبه الحالة عن بُعد حيث يتم تمرير الملف إلى الوظيفة ككتلة نصية ، لذا فإن فكرة الملف الذي جاء منه البرنامج النصي يضيع. يمكنك المرور في المسار أيضًا (على الرغم من أن هذا يبدو أقل من المثالي):
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
نصائح أخرى
محدث:
لقد جئت عبر هذا الكود مثال:
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) وإطلاق النار على الموقع يحرك العملية التنفيذ الحالية إلى دليل البرنامج النصي ، لذلك ، من هناك يمكنك تحديد الموقع النسبي.
كما يذكر منشور المدونة ، يمكنك الحصول على هذا كنص خارجي (لقد اختبرت لي كـ start-jobat.ps1) أو جعلها جزءًا من ملف تعريف حساب المستخدم/الخدمة الخاص بك.