PowerShell

نصوص PowerShell لديك، مع الجدولة التي لم تحصل عليها قط.

يشغّل Dagu نصوص PowerShell و pwsh و cmd.exe كخطوات عادية في مسار عمل، فتبقى النصوص القائمة على حالها وتكتسب ترتيبًا وإعادة محاولة وسجلات لكل خطوة وسجل تشغيل يمكن فتحه في المتصفح.

PowerShell و pwsh و cmd.exe في مسار العمل نفسه
اختيار الصدفة لكل مسار عمل أو لكل خطوة
مخرجات نص برمجي تغذّي النص التالي
يعمل كخدمة ويندوز
01

اختر الصدفة مرة واحدة، أو لكل خطوة

يعلن مسار العمل صدفته وترثها جميع الخطوات. وبدون إعلان يفضّل Dagu ترتيب PowerShell ثم pwsh ثم cmd.exe، فيتصرف المسار المكتوب على جهاز بشكل متوقَّع على جهاز آخر.

  • تقبل الصدفة نصًا أو مصفوفة؛ وصيغة المصفوفة تتجنب مشكلات علامات الاقتباس مع وسائط مثل -NoProfile
  • تلتقط الخطوة مخرجاتها في متغيّر مسمّى تستطيع الخطوات اللاحقة والشروط المسبقة قراءته
  • تتحكم الشروط المسبقة بالخطوة عبر تلك القيمة، فلا تحدث إعادة التشغيل إلا إذا كانت الخدمة متوقفة فعلًا
فحص خدمة وإعادة تشغيلها عند الحاجة فقط
# service-health.yaml
schedule: "*/15 * * * *"
max_active_runs: 1
shell: powershell -NoProfile

steps:
  - id: check_service
    run: |
      (Get-Service -Name 'MyAppSvc').Status
    output: SVC_STATUS

  - id: restart_if_stopped
    run: Restart-Service -Name 'MyAppSvc'
    depends: check_service
    preconditions:
      - condition: "${SVC_STATUS}"
        expected: "Stopped"
    retry_policy:
      limit: 2
      interval_sec: 30

mail_on:
  failure: true
02

PowerShell و cmd.exe في مسار عمل واحد

نادرًا ما تُعاد كتابة ملفات الدفعات القديمة لمجرد تغيير المجدول. تستطيع الخطوة تجاوز صدفة مسار العمل، فيظل مسار عمل معظمه PowerShell قادرًا على استدعاء ملف ‎.bat‎ الذي يعمل منذ عشر سنوات.

  • يوضع تجاوز الصدفة داخل with.shell؛ أما حقل shell المنفرد فلا يمكن دمجه مع run ويرفضه المدقّق
  • وللحصول على قائمة وسائط دقيقة دون أي تحليل من الصدفة، استخدم خطوة exec منظّمة تحتوي command و args
  • تحتفظ مسارات العمل المختلطة بجدولة واحدة وسجل واحد ومسار إشعار واحد

تحتوي مسارات ويندوز على شرطات مائلة عكسية، لذا يُفضَّل في YAML استخدام المقاطع الكتلية أو علامات الاقتباس المفردة. ففي النص المحاط بعلامتي اقتباس مزدوجتين تُعدّ الشرطة المائلة العكسية متبوعةً بحرف تهريبًا لا فاصل مسار.

PowerShell و cmd وتنفيذ مباشر في ملف واحد
# maintenance.yaml
schedule: "0 3 * * *"
shell: ["powershell", "-NoProfile"]

steps:
  - id: report_disk
    run: Get-PSDrive -PSProvider FileSystem | Out-String
    output: DISK_REPORT

  - id: legacy_job
    run: |
      @echo off
      call C:\ops\legacy\run.bat
    with:
      shell: cmd
    depends: report_disk

  - id: direct_exec
    action: exec
    with:
      command: C:\Windows\System32\cmd.exe
      args:
        - /c
        - echo
        - done
    depends: legacy_job

mail_on:
  failure: true
03

النصوص متعددة الأسطر تبقى مقروءة

تستطيع الخطوة أن تحتوي كتلة نص برمجي كاملة بدل سطر واحد، فتبقى الأنابيب والمرشِّحات بالصيغة التي يكتبها مؤلف PowerShell عادةً.

  • تحافظ المقاطع الكتلية على فواصل الأسطر، فتبقى الأنابيب الممتدة على أسطر متعددة كما هي
  • تنطبق retry_policy على الخطوة بأكملها، وهو ما يناسب النصوص التي تتعامل مع مسارات شبكة غير مستقرة أو ملفات مشغولة
  • يُختار pwsh و Windows PowerShell بالاسم، فيشغّل المضيف الذي يضم كليهما كل مسار عمل على النسخة المقصودة
نص لأرشفة السجلات وفق جدول زمني
# archive-logs.yaml
schedule: "30 1 * * *"
shell: pwsh -NoProfile

steps:
  - id: archive
    run: |
      $cutoff = (Get-Date).AddDays(-30)
      Get-ChildItem -Path 'D:\logs' -Filter *.log |
        Where-Object { $_.LastWriteTime -lt $cutoff } |
        Compress-Archive -DestinationPath 'D:\archive\logs.zip' -Update
    retry_policy:
      limit: 2
      interval_sec: 60

  - id: verify
    run: Test-Path 'D:\archive\logs.zip'
    depends: archive

mail_on:
  failure: true
04

من أين يعمل

لا فائدة من الجدولة ما لم يكن المجدول نفسه قيد التشغيل. يستطيع مثبِّت ويندوز تسجيل Dagu كخدمة، فتبدأ مسارات العمل مع تشغيل الجهاز لا مع جلسة مستخدم مسجَّل الدخول.

  • يسجّل مثبِّت PowerShell خدمة ويندوز عبر غلاف WinSW مثبَّت الإصدار، ويمكن التحقق منها بـ Get-Service
  • تُنشَر إصدارات ويندوز لمعماريات amd64 و 386 و arm64
  • تعرض وحدة التحكم على الويب سجل التشغيل والمخرجات لكل خطوة من أي متصفح، فلا يحتاج فحص المهمة إلى جلسة سطح مكتب بعيد

الهدف الآمن هو Windows Server 2019 وما بعده. أما الإصدارات الأقدم التي تفتقر إلى AF_UNIX فلا تزال تنفّذ مسارات العمل، لكن مقبس الحالة الحية والتحكم بالإيقاف غير متاح ويسجّل Dagu تحذيرًا.

FAQ

Practical questions before adopting

هل عليّ إعادة كتابة نصوصي بصيغة YAML؟

لا. يصف ملف YAML متى يعمل النص وعلى ماذا يعتمد وماذا يحدث عند الفشل. أما النص نفسه فيبقى ملف ‎.ps1‎ يُستدعى بالطريقة نفسها التي كان يستدعيه بها برنامج جدولة المهام.

كيف أمرّر قيمة من نص برمجي إلى التالي؟

امنح الخطوة المنتِجة اسم مخرجات ثم أشِر إليه في الخطوات اللاحقة. ويعمل المرجع نفسه داخل شرط مسبق، وهو ما يتيح تخطّي خطوة ما لم يُرجِع فحص سابق قيمة معينة.

هل يمكن لمسار عمل واحد استخدام Windows PowerShell و pwsh معًا؟

نعم. اجعل أحدهما الافتراضي لمسار العمل وتجاوَزه بالآخر في الخطوات التي تحتاجه. ويُختار كلاهما باسم الملف التنفيذي.

لماذا يرفض المدقّق حقل shell في خطوتي؟

لا يمكن دمج حقل shell المنفرد مع run في الخطوة نفسها. ضَع التجاوز تحت with.shell بدلًا من ذلك، وتشغيل dagu validate يكشف ذلك قبل أن تنطلق الجدولة.

هل يعمل هذا على لينكس أيضًا؟

نعم. يعمل pwsh على لينكس وماك، ويصلح تعريف مسار العمل نفسه هناك. وتبقى الخطوات التي تستدعي cmd.exe أو أوامر ويندوز الحصرية هي الجزء الخاص بويندوز.

Next step

Start with one workflow.

Install Dagu, move one script that runs on cron today into YAML, and decide from a real run history.