উইন্ডোজের কমান্ড প্রম্পট থেকে কীভাবে নিজের প্রক্রিয়া পিড পাবেন


26

আমি একটি কমান্ড প্রম্পট (ব্যাট স্ক্রিপ্টগুলিতে পরে ব্যবহারের জন্য) থেকে আমার নিজস্ব পিআইডি পাওয়ার উপায় খুঁজে পেতে চেষ্টা করছিলাম, তবে এখান থেকে getpids.exe ব্যবহার করা আমার একমাত্র কার্যকর উপায় ছিল: http://www.scheibli.com/ প্রকল্পগুলি / getpids / index.html তবে আমি উইন্ডোতে "অন্তর্নির্মিত" কমান্ড খুঁজছি

সম্পাদনা করুন: আমি একটি "বুলেট প্রুফ" উপায় খুঁজছি - আমার প্রক্রিয়াটি কেবলমাত্র সেন্টিমিডি.এক্সই বা কোনও কিছুর বিষয়ে কোনও অনুমান নয়

উত্তর:


36

যেহেতু অন্যান্য সমাধানগুলির কোনওই বুলেটপ্রুফ এবং অন্তর্নির্মিত নয়, তাই আমি বুঝতে পেরেছিলাম যে আমি নিম্নলিখিত সমাধানটি সরবরাহ করব, তবে মনে রাখবেন যে আপনাকে কোনওভাবে ফলাফলগুলি পার্স / সংরক্ষণ করতে হবে:

title mycmd
tasklist /v /fo csv | findstr /i "mycmd"

সত্যিই ঝরঝরে। আমি বেশ নিশ্চিত যে বর্তমান সময় + কিছু এলোমেলোভাবে উত্পাদিত নম্বর বুলেটপ্রুফের কাছাকাছি পেতে শিরোনাম হিসাবে সেট করা যেতে পারে
রাদাই

3
যদি আপনার সময়সূচী একই সময়ে দু'বার আপনার ব্যাচ স্ক্রিপ্টে কল করে তবে% এলোমেলো% +% সময়% ব্যবহার করবেন না। আমার সমস্যা ছিল যে একই স্ক্রিপ্টকে একই সাথে বিভিন্ন পরামিতিগুলির সাথে ডাকা হয়েছিল। এলোমেলো জন্য বীজ একই ছিল এবং একটি অস্থায়ী ডিরেক্টরি তৈরি করার সময় আমি সংঘর্ষের মধ্যে পড়েছিলাম। অস্থায়ী ডিরেক্টরি তৈরি করার সময় ত্রুটিটি হ্যান্ডেল করার কোনও উপায় ছিল না। দীর্ঘ গল্প সংক্ষিপ্ত, আপনি যদি ধরে নিতে পারেন যে আপনার স্ক্রিপ্ট একই সময়ে দু'বার মুছে ফেলা হয় না, এই কৌশলটি কাজ করা উচিত।
পিটার শোয়েটজ

(গভীরভাবে না পরীক্ষা) হতে পারে (তত্সহ একটি আরো সঠিক টাইমস্ট্যাম্প পেয়ে microsecondsবদলে 1/100 সেকেন্ড মত% সময়%), এই ক্ষেত্রে অধিক নির্ভরযোগ্য হতে হবে: wmic os get LocalDateTime(YearMonthDayHourMinuteSecond.Microsecond + + টাইমজোন)। সময়সূচী সঠিক মাইক্রোসেকেন্ডে দুটি জিনিস চালাতে সক্ষম না হলে ...
গৌথির বোয়াগলিও

কম্পিউটারে অন্য একটি অধিবেশনটিতে প্রক্রিয়াটি চলমান থাকলে এটি কাজ করবে না কারণ শিরোনামটি এন / এ হিসাবে দেখানো হয়েছে
ফ্রিঙ্ক দ্য ব্রাভ

এটি পিতামাতার প্রক্রিয়াটির পিআইডি দেয়।
অ্যাক্সেস_গ্রন্থিত

7

আমি বিশ্বাস করি যে নিম্নলিখিতটি বুলেটপ্রুফ রয়েছে, তবে ব্যবহারকারী যদি ডাব্লুএমআইসি এবং টিইএমপিতে কোনও বৈধ পথে প্রবেশ করতে পারে যেখানে ব্যবহারকারীর লেখার সুযোগ রয়েছে। এটি http://www.dostips.com/forum/viewtopic.php?f=3&t=6133- তে কিছু সহযোগী কাজের শেষ ফলাফল ।

@echo off

:getPID  [RtnVar]
::
:: Store the Process ID (PID) of the currently running script in environment variable RtnVar.
:: If called without any argument, then simply write the PID to stdout.
::
setlocal disableDelayedExpansion
:getLock
set "lock=%temp%\%~nx0.%time::=.%.lock"
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
2>nul ( 9>"%lock%" (
  for /f "skip=1" %%A in (
    'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
  ) do for %%B in (%%A) do set "PID=%%B"
  (call )
))||goto :getLock
del "%lock%" 2>nul
endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%"
exit /b

স্ক্রিপ্টটি একটি অস্থায়ী ফাইলের উপর একটি একচেটিয়া লক স্থাপন করে যা বর্তমান সময়টিকে নামের সাথে অন্তর্ভুক্ত করে। যদি কেবল দুটি ব্যাচের প্রক্রিয়া একই 0.01 দ্বিতীয় বারের ব্যবধানের মধ্যে পিআইডি পাওয়ার চেষ্টা করে তবে কেবলমাত্র একজনই সাফল্য অর্জন করতে পারে a

ব্যর্থ যে কোনও প্রক্রিয়া বারবার ফিরে ফিরে আসবে এবং এটি সফল না হওয়া পর্যন্ত নতুন লক ফাইল পাথ দিয়ে আবার চেষ্টা করবে।

লক ফাইলের পুরো পথটি একটি অনন্য আইডিতে রূপান্তরিত হয় যা ডাব্লুএমআইসি কোয়েরিতে ব্যবহার করা যেতে পারে। ডাব্লুএমআইসি একটি ফর / এফ কমান্ডের মধ্যে চালিত হয়, যার অর্থ এটি একটি শিশু সেন্টিমিডি.এক্স.সি প্রক্রিয়াতে চলছে। সে কারণেই cmd.exe প্রক্রিয়াটির প্যারেন্টপ্রসেসিড পুনরুদ্ধার করা হয়েছে।


7

টনি রথের উত্তরটি প্রসারিত:

title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do echo %f

WINDOWTITLE ফিল্টারটি ব্যবহার করা পাইপটিকে এড়ানো যায় যাতে আপনি এটি লুপের জন্য রাখতে পারেন এবং এটি পছন্দ মতো SET এর সাথে একটি ভেরিয়েবলে নির্ধারণ করতে পারেন:

title uniqueTitle
for /f "tokens=2 USEBACKQ" %f IN (`tasklist /NH /FI "WINDOWTITLE eq uniqueTitle*"`) Do set ourPID=%f

মেকগুলি সরানো /vএটি দ্রুততর করে তোলে এবং /NHশিরোনামের রেখাটি থেকে মুক্তি পাওয়া যায়। আপনার পরে ওয়াইল্ডকার্ড প্রয়োজন "uniqueTitle"কারণ উইন্ডো শিরোনামটিতে প্রকৃত বর্তমান কমান্ড রয়েছে (এটি আপনি পুরোপুরি মেলে চেষ্টা করার পরে এটি চলতে থাকবে)।


6

পাওয়ারশেল + ডাব্লুএমআই ব্যবহার করে:

powershell (Get-WmiObject Win32_Process -Filter ProcessId=$PID).ParentProcessId

নিস; যদি আপনার পাওয়ারশেল কোর থাকে তবে এটি আরও সহজ হয়ে যায় (যদিও কোনও আদেশই দ্রুত নয় ):pwsh -noprofile -c "(Get-Process -Id $PID).Parent.Id"
এমকিলেমেন্ট

5
  1. উইন্ডোজ টাস্ক ম্যানেজার, আপনাকে দেখতে -> কলাম নির্বাচন করুন .. এবং পিআইডি নির্বাচন করতে হবে।
  2. কমান্ড প্রম্পটে ভারবস টাস্ক তথ্য পেতে "টাস্কলিস্ট / ভি"।
  3. Live.sysinternals.com থেকে প্রক্রিয়া এক্সপ্লোরার ।

2
@ বিবেক, একটি কমান্ড প্রম্পট থেকে ... এবং আপনি উত্তরগুলি
ফাঁকি দিচ্ছেন

আমি কেবল সমস্ত সম্ভাব্য বিকল্প দিয়েছি .. এবং কোনও সদৃশও নেই .. আমি পাওয়ারশেলের কথাও উল্লেখ করতে পারতাম তবে আমি নিজেকে আটকে রেখেছিলাম কারণ এটি এক্সপি এবং 2003 এ ডিফল্টরূপে আসে না If ।
বিবেক কুমার

5

যদি আপনি জানেন যে কেবলমাত্র একটি সেন্টিমিটার রয়েছে ex এক্স চলমান থাকে তবে আপনি এইভাবে পিআইডি পেতে পারেন:

for /F "tokens=1,2" %%i in ('tasklist /FI "IMAGENAME eq cmd.exe" /fo table /nh') do set pid=%%j

echo %pid%

এটি একটি অসম্ভব ধারণা হিসাবে শোনাচ্ছে, আপনার কোডটি ফ্লেক হতে পারে
রাউল সালিনাস-মন্টেইগুডো

রাউল, আপনি কী বলছেন তা আমি বুঝতে পেরেছি। এটা তোলে অনেক ক্ষেত্রে অনিরাপদ, কিন্তু কিছু নিরাপদ - যেমন একটি কিয়স্ক সিস্টেম বা একটি VM যেখানে আপনি কি প্রসেস শুরু করেছে এবং মোট নিয়ন্ত্রণে থাকেন যেমন
zumalifeguard

4

এই কৌতুক করতে হবে:

টাস্কলিস্ট / ভি


3

যদি আপনি "notepad.exe" চিত্রের পিআইডি সন্ধান করতে চান তবে নীচের কোডটি আপনার জন্য কাজ করবে:

for /F "tokens=1,2" %i in ('tasklist') do (
 if "%i" equ "notepad.exe" (set x=%j)
)
echo %x%

2

যদি আপনি উইন্ডোজ 2003 রিসোর্স কিট পেয়ে থাকেন তবে আপনি চান কেবল লাইনটি পেতে Qgrep এর মাধ্যমে এটি চাপ দিন। তারপরে আপনি এখান থেকে পিডটি বের করতে পারবেন (এটি ধরে নেওয়া হয় আপনি একবারে কেবলমাত্র একটি সেন্টিমিটার চালিয়ে এসেছেন),

tasklist /v | qgrep cmd

cmd.exe 2040 RDP-Tcp#447 0 1,804 K Running MACHINE\Administrator  0:00:00 Command Prompt


0

খোলা সিএমডি-র জন্য প্রসেস আইডি পাওয়ার এই ছোট উপায়

tasklist /v /fi "imagename EQ cmd.exe" /FO LIST | FIND "PID:"

0

এই উত্তরটি আপনাকে কেবলমাত্র প্রক্রিয়া আইডি দেবে, এবং উপরের উত্তরের অন্তর্ভুক্ত অতিরিক্ত স্টাফগুলির মধ্যে কোনওটিই নয়।

title mycmd
tasklist /v /fo csv | findstr /i "mycmd" > PIDinfo.txt

set /p PIDinfo=<PIDinfo.txt
set PID1=%PIDinfo:~11,5%
set PID2=%PIDinfo:~11,4%

if %PID2% gtr 8100 (
    set PID=%PID2%
) else (
    set PID=%PID1%
)

echo %PID%

ব্যাখ্যা:

- সেমিডি.এক্স.ইসির জন্য একটি পিআইডি হবে না যা ১৮০০ এর চেয়ে বড়, সুতরাং পিআইডি ৮১০০ এর চেয়ে বেশি কিনা তা পরীক্ষা করে দেখুন সুতরাং আমরা জানি যে এটি একটি ৪ ডিজিটের বা 5 সংখ্যার সংখ্যা কিনা

কেস 1: 17504 এর মতো 5 ডিজিটের পিআইডি-তে একটি PID1 ভাল 17504 এবং 1750 এর একটি PID2 ভাল রয়েছে, তাই আমরা PID1 ব্যবহার করি

কেস 2: 8205 এর মতো একটি 4 ডিজিটের পিআইডি 8205 এর একটি পিআইডি 1 ভাল এবং 8205 এর একটি পিআইডি 2 ভাল রয়েছে, তাই আমরা পিআইডি 2 ব্যবহার করি

কেস 3: 4352 এর মতো একটি 4 ডিজিটের পিআইডি-র 4352 এর একটি পিআইডি 1 ভাল এবং 4352 এর একটি পিআইডি 2 ভাল রয়েছে, তাই আমরা পিআইডি 2 ব্যবহার করি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.