سؤال

هل هناك طريقة لتحديد دليل عمل لأمر بدء العمل؟

حالة الاستخدام:

أنا في دليل، وأريد فتح ملف باستخدام 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] }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top