我想为进程运行时创建一个唯一的目录(以完成我在这个问题)。我试过了,%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= 内容。