<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10262</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10262&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Определение Process ID текущего cmd.exe».]]></description>
		<lastBuildDate>Sat, 28 Oct 2023 20:26:54 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159407#p159407</link>
			<description><![CDATA[<p>Можно попробовать передавать идентификатор процесса cmd через ERRORLEVEL:<br />(Win7)</p><p><strong>cpid.cmd</strong><br /></p><div class="codebox"><pre><code>
@set @q=1/*

 :: ---------------------------------
 :: Идентификатор текущего процесса CMD
 :: (возврат значения через ERRORLEVEL)
 :: ---------------------------------

 @echo off
 setlocal enableextensions enabledelayedexpansion

 cscript /nologo /e:jscript &quot;%~f0&quot;

 set pid=%ERRORLEVEL%
 echo PID: %pid%

 pause
 goto :eof
 
*/

 var wql = &quot;winmgmts:\\\\.\\root\\cimv2:win32_process.Handle=&quot;;

 var oProc = GetObject(wql + new ActiveXObject(&quot;WScript.Shell&quot;).Exec(&quot;rundll32 kernel32,Sleep&quot;).ProcessId);
 PID_WSH = oProc.ParentProcessId;
 oProc.Terminate;

 var oProc = GetObject(wql + PID_WSH);
 PID_CMD = oProc.ParentProcessId;

 WScript.Quit(PID_CMD);
</code></pre></div><p><a href="http://forum.script-coding.com/viewtopic.php?pid=67139#p67139">CMD/BAT: возврат значений из процедур через параметры</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=50284#p50284">WSH: как из скрипта определить его идентификатор процесса (PID)</a></p><p>С применением утилиты <a href="https://ramensoftware.com/winapiexec">winapiexec</a>:<br /></p><div class="codebox"><pre><code>
 :: ---------------------------------
 :: Идентификатор текущего процесса CMD
 :: (используется winapiexec.exe)
 :: (возврат значения через ERRORLEVEL)
 :: (переменная ERRORLEVEL возвращается через функцию system)
 :: ---------------------------------

 @echo off
 setlocal enableextensions enabledelayedexpansion

 set pid0=%1
 if &quot;%pid0:~1,7%&quot;==&quot;initpid&quot; goto scr2
 
 winapiexec.exe k@GetCurrentProcessId , k@AttachConsole -1 , msvcrt.dll@sprintf $b:255 $s:&quot;cmd /c &quot;%~f0&quot; /initpid:%%u&quot; $$:1 , msvcrt.dll@system $$:7 , k@FreeConsole , k@ExitProcess $$:11

 set pid=%ERRORLEVEL%
 echo PID: %pid%

 pause
 exit /b 0
 
 :: ---------------------------------
 :scr2
 set pid0=%pid0:/initpid:=%

 for /f &quot;usebackq tokens=2 delims==&quot; %%b in (`wmic process where ^(processid^=%pid0%^) GET parentprocessid /format:VALUE`) do set pid1=%%b
 exit /b %pid1%
</code></pre></div><p>С применением LangMF 11:<br /></p><div class="codebox"><pre><code>
 :: ---------------------------------
 :: Идентификатор текущего процесса CMD
 :: (LangMF 11)
 :: (возврат значения через ERRORLEVEL)
 :: ---------------------------------

 @echo off
 setlocal enableextensions enabledelayedexpansion

 &quot;C:\Progra~1\LangMF\LangMF_stand.exe&quot; $ sTxt=&quot;winmgmts:\\.\Root\CIMV2:Win32_Process.Handle=PID&quot; : lPID1=DllCall(&quot;KERNEL32.DLL&quot;,&quot;GetCurrentProcessId&quot;) : sTxt=~igm/&quot;PID&quot;/lPID1/ : lPID2=GetObject(sTxt).ParentProcessId : r=DllCall(&quot;KERNEL32.DLL&quot;,&quot;ExitProcess&quot;,lPID2)

 set pid=%ERRORLEVEL%
 echo PID: %pid%

 pause
 exit /b 0
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sat, 28 Oct 2023 20:26:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159407#p159407</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89653#p89653</link>
			<description><![CDATA[<p><strong>Yury</strong><br />Видимо Вы не видите проблему, о которой я говорю. Запустите свой скрипт в конвейере. У Вас почти всегда будет одинаковое время. </p><p><strong>greg zakharov</strong><br /></p><div class="quotebox"><blockquote><p>Тогда ...</p></blockquote></div><p>Коллега, не могли бы Вы выражать свои мысли яснее? Короткие фразы в контексте Ваших мыслей сложно понять в контексте тематической дискуссии.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 21 Dec 2014 08:53:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89653#p89653</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89652#p89652</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Однако мне не понятно как счетчики производительности могут помочь в определении PID текущего экземпляра cmd.exe.</p></blockquote></div><p>Скорее PPID.<br /></p><div class="quotebox"><blockquote><p>Не могу ответить. У меня нет такой возможности.</p></blockquote></div><p>Тогда проблема на порядок выше, чем кажется.</p>]]></description>
			<author><![CDATA[null@example.com (greg zakharov)]]></author>
			<pubDate>Sun, 21 Dec 2014 07:24:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89652#p89652</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89649#p89649</link>
			<description><![CDATA[<p><strong>Rumata</strong>, да, время одинаковое, но у Вас речь идёт о секундах. А вот так всегда разное: </p><div class="codebox"><pre><code>@wmic os get LocalDateTime /value</code></pre></div><p>.<br />А ведь &quot;WMIC&quot; при сортировке ориентируется именно на этот формат.</p>]]></description>
			<author><![CDATA[null@example.com (Yury)]]></author>
			<pubDate>Sat, 20 Dec 2014 22:54:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89649#p89649</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89647#p89647</link>
			<description><![CDATA[<p><strong>Yury</strong><br />запустите следующий код в виде </p><div class="codebox"><pre><code>script | script</code></pre></div><p> или даже </p><div class="codebox"><pre><code>script &amp; script</code></pre></div><p> чтобы увидеть, что время создания процессов в подавляющем большинстве случаев одинаково. <br /></p><div class="codebox"><pre><code>
@wmic path win32_localtime get second /value &gt;&amp;2
</code></pre></div><p><strong>greg zakharov</strong><br /></p><div class="quotebox"><blockquote><p>есть счетчики производительности</p></blockquote></div><p>я не сомневаюсь в Вашей компетентности в powershell. Однако мне не понятно как счетчики производительности могут помочь в определении PID текущего экземпляра cmd.exe. </p><div class="quotebox"><blockquote><p>что, если пользователь привык работать с урезанными правами в системе?</p></blockquote></div><p>Не могу ответить. У меня нет такой возможности.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 20 Dec 2014 22:24:41 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89647#p89647</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89646#p89646</link>
			<description><![CDATA[<p><strong>Rumata</strong>, у меня есть большое подозрение, что &quot;WMIC&quot; сортирует одноимённые процессы по их дате создания, начиная со старшей, поэтому, если это подтвердится, то в моём коде, например, достаточно поставить скобки, чтобы получить гарантию, что полученный &quot;PID&quot; относится к текущему процессу, а не к процессу, запущенному ранее: </p><div class="codebox"><pre><code>@(for /f %%i in (&#039;set &quot;x=%~f0&quot;^&amp; call wmic process where &quot;CommandLine like &#039;%%%%x:\=\\%%%%&#039;&quot; get ProcessId^| findstr [0-9]&#039;) do @set PID=%%i)&amp; call echo %%PID%%&amp; pause&gt;nul&amp; exit /b</code></pre></div><p>.</p>]]></description>
			<author><![CDATA[null@example.com (Yury)]]></author>
			<pubDate>Sat, 20 Dec 2014 21:43:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89646#p89646</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89641#p89641</link>
			<description><![CDATA[<p>Между прочим, способ не универсальный: что, если пользователь привык работать с урезанными правами в системе?</p>]]></description>
			<author><![CDATA[null@example.com (greg zakharov)]]></author>
			<pubDate>Sat, 20 Dec 2014 20:48:05 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89641#p89641</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89640#p89640</link>
			<description><![CDATA[<p>Если бы Вы предложили эдакий хак с typeperf и tasklist - другое дело, в противном случае это уже из области Managed CMD\BAT.</p>]]></description>
			<author><![CDATA[null@example.com (greg zakharov)]]></author>
			<pubDate>Sat, 20 Dec 2014 20:37:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89640#p89640</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89639#p89639</link>
			<description><![CDATA[<p>А Ваш, нужно, полагать, дает? И потом, зачем WMI, когда есть счетчики производительности? <span class="postimg"><img src="http://powershell.com/cs/emoticons/emotion-8.gif" alt="http://powershell.com/cs/emoticons/emotion-8.gif" /></span><br /></p><div class="codebox"><pre><code>(New-Object Diagnostics.PerformanceCounter(&#039;Process&#039;, &#039;Creating Process ID&#039;, &#039;cmd&#039;)).RawValue</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (greg zakharov)]]></author>
			<pubDate>Sat, 20 Dec 2014 20:21:26 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89639#p89639</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89638#p89638</link>
			<description><![CDATA[<p><strong>Yury</strong>, Ваш вариант с использованием WMIC работает. Однако он не дает гарантии, что в данный момент запущен единственный экземпляр скрипта, например в конвейере.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 20 Dec 2014 20:17:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89638#p89638</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89637#p89637</link>
			<description><![CDATA[<p><strong>Rumata</strong>, как вариант: </p><div class="codebox"><pre><code>@for /f %%i in (&#039;set &quot;x=%~f0&quot;^&amp; call wmic process where &quot;CommandLine like &#039;%%%%x:\=\\%%%%&#039;&quot; get ProcessId^| findstr [0-9]&#039;) do @set PID=%%i&amp; call echo %%PID%%&amp; pause&gt;nul&amp; exit /b</code></pre></div><p>.</p>]]></description>
			<author><![CDATA[null@example.com (Yury)]]></author>
			<pubDate>Sat, 20 Dec 2014 19:57:44 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89637#p89637</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: Определение Process ID текущего cmd.exe]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=89629#p89629</link>
			<description><![CDATA[<p>Среди многообразия командных процессоров cmd.exe особо выделяется бедностью и скупостью программных средств. Самоидентификация, или предоставление информации о себе - одно из них. В данном случае речь идет о PID или ProcessID, идентификаторе процесса. cmd.exe не может дать свой PID.</p><p>И так! Пафосное вступление закончилось. А теперь суть. </p><p>Зачем может понадобиться PID? Это уникальное число в данный момент времени. </p><p>-- С помощью PID просто сослаться именно на свой процесс (утилита tasklist ненадежна - достаточно запустить две копии cmd.exe и вы уже не знаете кто из них кто). <br />-- Может быть удобно при создании временных файлов, каталогов (использование переменной %RANDOM% в качестве части имени файла приводит к конфликтам - <a href="http://forum.script-coding.com/viewtopic.php?id=6256">CMD/BAT: Проблема создания уникальных значений в конвейерных командах</a>)</p><p>Предлагаю небольшой скриптик <strong>cmdpid.bat</strong>, который помогает идентифицировать PID текущей (!!!) копии cmd.exe. Найденное значение записывается в переменную окружения CMDPID. Функционал реализован на powershell. Суть скрипта в 4 строках после метки :cmdpid, которые можно смело скопировать в свой скрипт; все остальные - суть обвязка для удобства использования в качестве самостоятельной утилиты. </p><div class="codebox"><pre><code>
@echo off

if &quot;%~1&quot; == &quot;/?&quot; goto :help
if &quot;%~1&quot; == &quot;-?&quot; goto :help

if /i &quot;%~1&quot; == &quot;/h&quot; goto :help
if /i &quot;%~1&quot; == &quot;-h&quot; goto :help


for %%p in ( powershell.exe ) do if &quot;%%~$PATH:p&quot; == &quot;&quot; (
    &gt;&amp;2 echo:%%p required.
    exit /b 1
)


:cmdpid
for /f &quot;tokens=*&quot; %%p in ( &#039;
    set &quot;PPID=(Get-WmiObject Win32_Process -Filter ProcessId=$P).ParentProcessId&quot; ^&amp; ^
    call powershell -NoLogo -NoProfile -Command &quot;$P = $pid; $P = %%PPID%%; %%PPID%%&quot;
&#039; ) do set CMDPID=%%p

goto :EOF


:help
echo:Calculates the Process ID of the Command Prompt 
echo:and assigns it to the CMDPID variable.
echo:
echo:Usage: %~n0
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 20 Dec 2014 16:57:46 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=89629#p89629</guid>
		</item>
	</channel>
</rss>
