سؤال

وأنا بحاجة إلى تحديد عملية) ID من ملف دفعي تنفيذ من برنامج نصي بوويرشيل (V1.0). يمكن لأي شخص أن يقترح طريقة للقيام بذلك؟

شكرا، MagicAndi.

هل كانت مفيدة؟

المحلول

حسنا، سواء كان ذلك من الممكن يتوقف على كيفية تنفيذ الملف دفعة واحدة.

وبصفة عامة، فإن الطريقة الوحيدة التي يمكن ان معرفة ذلك هو أن ننظر إلى سطر الأوامر المستخدمة لبدء دفعة واحدة. إذا نقرت نقرا مزدوجا فوق ملف دفعي في مستكشف Windows ستحصل على سطر الأوامر مثل

cmd /c ""C:\Users\Me\test.cmd" "

في بوويرشيل يمكنك بعد ذلك استخدام Get-WMIObject على Win32_Process الذي يتضمن سطر الأوامر:

PS Home:\> gwmi Win32_Process | ? { $_.commandline -match "test\.cmd" } | ft commandline,processid -auto

commandline                             processid
-----------                             ---------
cmd /c ""C:\Users\Me\test.cmd" "             1028

ولكن، إذا كنت بدأت الدفعة مباشرة من موجه الأوامر، ثم لديك أي وسيلة لايجاد خارجيا إلى أن الدفعة قيد التشغيل والذي بدأ.

نصائح أخرى

ولقد وجدت طريقة واحدة لاكتشاف PID من ملف دفعي قيد التشغيل. سوف تحتاج إلى تعيين عنوان إطار وحدة التحكم دفعة في ملف دفعي لتحديد ما يلي:

...
Title MyBatchWindow
...

في السيناريو بوويرشيل، يمكنك التحقق من الملكية MainwindowTitle واسترداد PID من عملية يطابق عنوان النافذة الدفعي:

$batchProcess = get-process cmd | where-Object {$_.MainWindowTitle -eq "MyBatchWindow"}
$processID = $batchProcess .ID
...

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

لا أعتقد ذلك ممكنا بطريقة موثوقة. الملفات الدفعية أنفسهم لا إطلاق عملية منفصلة ولكنها تدار بدلا ضمن مثيل CMD.EXE. لا يوجد أي تصدير البيانات من تلك العملية الخاصة التي سوف اقول لكم ما موثوق ملف يتم تشغيل.

والاستثناء الوحيد هو إذا شنت المثال CMD.EXE خصيصا لتشغيل ملف دفعي. في هذه الحالة على ما يبدو في سطر الأوامر من التطبيق وسيكون من الممكن على البقرى سطر الأوامر لملف دفعة واحدة. وهذا لن يحل الحالة الطبيعية على الرغم من الملفات دفعة متعددة تدار من داخل CMD.EXE الفوري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top