0

我有一段代码;

:check
for /f "tokens=1* delims==" %%A in ('"wmic process get description, commandline /format:list"') do (
  if "%%A"=="CommandLine" (
    set "cmd=%%B"
  ) else if "%%A"=="Description" (
    set "desc=%%B"
    setlocal enableDelayedExpansion
    set "desc=!desc:~0,-1!"
    set "cmd=!cmd:~0,-1!"
    if /i !desc! == %1         (
      echo !cmd! >>C:\test.txt
    )
    endlocal
  )
)
goto:eof

这非常有效(这实际上是一个从批处理文件调用的函数,例如

call:check processname1.exe
call:check processname2.exe
call:check processname3.exe
etc...

我想做的(如果可能的话)是,除了回显到文件之外,我希望能够创建 2 个变量。就像是;

processname1.exe processname3.exe   <-- (for each process 'checked' if it IS running, append its name to this variable)
commandlinepath1 commandlinepath2   <-- (for each process 'checked' if it IS running, append its path to this variable)

如果这是可能的,然后我可以稍后在我的脚本中调用这些变量,我希望能够 tskill 正在运行的进程(如果可以制作上面的变量就足够简单了),然后再重新打开这些进程(使用原始路径中的命令行参数。这就是我迷路的地方。

我上面的代码(写入文件)。会给出类似的结果;

"C:\somefolder\someexe.exe" -some_parameter
"C:\some therfolder\someotherexe.exe"
"C:\another older\anotherexe.exe" param1 param2

但是我需要做的是获取该文件的每一行(或变量,如果可能的话),然后运行它们(如果我将每一行复制到 windows 的 RUN 命令中,它可以工作,但通过 CMD 执行它不会) .

我尝试使用 for 循环打开文件,它确实如此,除了脚本等待进程完成之前继续(并且这些进程不会结束,因为它们是应用程序)。如果我尝试使用 START .. 那么它会加载一个新的 CMD 窗口??

我需要做的(如果有更好的选择)是

  • 对于一组预先确定的进程,检查它们是否正在运行
  • 杀死那些(如果不是,忽略它)
  • 删除一些文件(我可以这样做,杀死进程的原因是它们保持文件打开,防止删除)
  • 重新打开所有最初运行的程序

谢谢..

4

1 回答 1

1

不是直接的答案,但既然您已经使用 wmic,也许使用它的内置功能(查询、启动和停止)会使您的目标更容易实现?

我想出了以下内容:

@echo off
setlocal
for %%C in (notepad.exe) do (
    for /f "skip=1 tokens=2 delims==" %%F in ('wmic process where description^="%%C" get commandline /format:list') do (
    REM required to normalize unicode output from WMIC 
    set commandline=%%F
    REM '\=\\' required as wmic treats \ as escape char in query
    call wmic process where commandline='%%commandline:\=\\%%' terminate

    REM do your work here

    call wmic process call create '%%commandline%%'

    )
)

它的作用:首先for提供进程名称。在我的示例中,它只是notepad.exe,但您可以使用 list: 调用for (process1 process2 process3),或将其替换为for /f以提供来自文件的值。如果要使用带引号的名称,则必须从下一行 ( description^="%%C") 中删除引号。
第二个for真正的工作:它获取与描述匹配的所有进程的列表,并依次停止和启动它们中的每一个。

要尝试它,只需将其放入 中batfile.bat,打开记事本并执行。
注意:如果你用一个文件打开记事本,要么指定一个绝对路径,要么通过资源管理器(双击)。这里的问题是当前目录 - 如果您的任何进程确实引用了相对路径,您也可能会偶然发现(不太可能,但并非不可能)

最后但并非最不重要的一点 - 在 powershell 中执行此操作将是最简单、最短和最可靠的。

于 2012-08-15T14:52:03.320 回答