如何获取我所在的 Windows cmd 的 PID

如何获取我所在的 Windows cmd 的 PID

我想为进程运行时创建一个唯一的目录(以完成我在这个问题)。我试过了,%random%但变化太慢了。等待不是一个可行的选择,因为我写这个是为了加快我的复制过程。

因此,我正在寻找我所在脚本的当前进程的 PID,以便以此命名路径。我需要将其放入变量中。

PID 稍后被另一个进程重用是可以的,只要我的脚本运行,它就必须是唯一的,因为无论如何我最终都会删除该目录。

我不需要另一个进程的 PID,所以这个问题没有帮助我。

我考虑过使用源路径和目标路径的组合(不带\),但这可能会与同时运行的其他复制操作发生冲突(例如,一个复制所有 txt 文件,另一个复制所有 jpg 文件,无论是从相同的目录复制还是复制到相同的目录)。

我的脚本是从另一个脚本调用的,所以我可以为每个副本提供一个独特的参数,但我宁愿不这样做,因为这样在其他想要使用副本的情况下我也需要这样做。

答案1

不是我的代码!

set T=%TEMP%\sthUnique.tmp
wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%
set /P A=<%T%
set PID=%A:~16%

当前进程的 PID 存储在PID变量中。

我不记得是谁做的,但它确实有效。可能有一些不必要的代码,但我无法解构它。

答案2

我解析了上述答案,并将其变成一行,尽管对于一行来说它有点长。

以下是交互式文件和批处理文件的形式:

交互的:

for /f "USEBACKQ TOKENS=2 DELIMS=="  %A in (`wmic process where ^(Name^="WMIC.exe" AND CommandLine LIKE "%%%%TIME%%%%"^) get ParentProcessId /value`) do set "PID=%A"

在批处理文件中

for /f "USEBACKQ TOKENS=2 DELIMS=="  %%A in (`wmic process where ^(Name^="WMIC.exe" AND CommandLine LIKE "%%%%TIME%%%%"^) get ParentProcessId /value`) do set "PID=%%A"

以下是对上述答案的解析:

set T=%TEMP%\sthUnique.tmp # used by the next command

设置任意临时文件和路径

wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%

这是最新的一行;它告诉 WMIC 根据它现在正在运行的事实查找它自己的进程并报告它的父 PID(即 CMD)相当递归!然后它将此信息写入临时文件。

set /P A=<%T% 

这通过读取上面的临时文件来设置变量 A。

set PID=%A:~16% 

这将使用子字符串解析出 ProcessID= 内容。

相关内容