PowerShell بدء تشغيل وظيفة العمل
-
19-09-2019 - |
سؤال
هل هناك طريقة لتحديد دليل عمل لأمر بدء العمل؟
حالة الاستخدام:
أنا في دليل، وأريد فتح ملف باستخدام emacs للتحرير. إذا قمت بذلك مباشرة، فسوف يمنع PowerShell حتى أغلق emacs. ولكن استخدام محاولات بدء العمل لتشغيل EMACS من الدليل الرئيسي الخاص بي، وبالتالي فتح emacs ملف جديد بدلا من واحد أردت.
حاولت تحديد المسار الكامل باستخدام PWD $، ولكن لم يتم حل المتغيرات في كتلة البرنامج النصي حتى يتم تنفيذها في سياق بدء العمل. وبالتالي فإن بعض الطرق التي يفرضها حل المتغيرات في سياق قذيفة ستكون إجابة مقبولة على هذا.
لذلك، إليك ما جربته، فقط للكمال:
Start-Job { emacs RandomFile.txt }
Start-Job { emacs "$pwd/RandomFile.txt" }
المحلول
سيكون الحل المحتمل إنشاء "سيناريو كيكر":
Start-Job -filepath .\emacs.ps1 -ArgumentList $workingdir, "RandomFile.txt"
سيبدو البرنامج النصي الخاص بك:
Set-Location $args[0]
emacs $args[1]
أتمنى أن يساعدك هذا.
نصائح أخرى
هناك حل جميل قسم تعليقات من بعض آخر المتأنق. وبعد يشير المعلق إلى استخدام Init
المعلمة لإعداد دليل العمل كتلة البرنامج النصي.
function start-jobhere([scriptblock]$block) {
Start-Job -Init ([ScriptBlock]::Create("Set-Location '$pwd'")) -Script $block
}
لتلخيص المشكلة:
بدأت وظيفة الخلفية مع
Start-Job
هل ليس ورث الموقع الحالي (دليل العمل).انها الافتراضات إلى
$HOME\Documents
في ويندوز بوبرشيل، و$HOME
في PowerShell Core (اعتبارا من PSV5.1 / PSV6 Alpha).إذا كنت تستخدم Powershell. النواة وأنت تستهدف ملف في حاضر الدليل، يمكنك استخدام ما يلي، لأن الجديد
... &
بناء الجملة افتراضيا يعمل المهمة في حاضر الدليل:
emacs RandomFile.txt &
انت لا تستطيع مباشرة المتغيرات المرجعية من حاضر جلسة في كتلة البرنامج النصي مرت
Start-Job
.
لتكمل الجواب المفيد JDMICHAL و جواد Asavartsov المفيد, ، والتي لا تزال تعمل بشكل جيد:
قدمت psv3 طريقة بسيطة للإشارة حاضر متغيرات الجلسة في كتلة البرنامج النصي تم تنفيذها في سياق مختلف (كملظيفة خلفية أو على جهاز بعيد)، عبر $using:
مجال:
Start-Job { Set-Location $using:PWD; emacs RandomFile.txt }
بدلا من ذلك:
Start-Job { emacs $using:PWD/RandomFile.txt }
ملحوظة:
هذه المشكلة جيثب يقترح إضافة أ
-WorkingDirectory
إلىStart-Job
cmdlet.Start-Job -WorkingDirectory $PWD { emacs RandomFile.txt } # WISHFUL THINKING
هذه المشكلة جيثب تقارير عدم القدرة المفاجئة للاستخدام
$using:
في كتلة البرنامج النصي مرت إلى-InitializationScript
, ، على الرغم من أنه يعمل في كتلة البرنامج النصي الرئيسي (الضمني-ScriptBlock
معامل).Start-Job -Init { Set-Location $using:PWD } { emacs RandomFile.txt } # FAILS
جرب هذا
Start-Job -inputobject $pwd -scriptblock { emacs "$input/RandomFile.txt" }
هنا $input
هو المتغير المحدد مسبقا أن تأخذ داخليا قيمة -inputobject
معامل
وظيفة البدء هي مبالغة لما تحتاجه (تشغيل أمر في الخلفية). يستخدم بدء العملية في حين أن:
Start-Process -NoNewWindow emacs RandomFile.txt
لا توجد مشكلة في الدليل الحالي في هذا النهج. لقد قمت أيضا بإنشاء وظيفة لجعل هذا بسيطا قدر الإمكان:
function bg() {Start-Process -NoNewWindow @args}
ثم يصبح الاحتجاج:
bg emacs RandomFile.txt
هذا يعمل على نظام التشغيل Windows 7 (PowerShell V2).
فقط من أجل اكتمال، إليك البرنامج النصي النهائي الذي قمت بتنفيذه بناء على إجابة فيلبورت، نمط المجتمع ويكي:
function Start-Emacs ( [string]$file )
{
Start-Job -ArgumentList "$pwd\$file" { emacs $args[0] }
}