【问题标题】:How do I reopen programs using CMD from a list or variable如何使用 CMD 从列表或变量中重新打开程序
【发布时间】:2012-08-15 13:23:34
【问题描述】:

我有一段代码;

: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 正在运行的进程(如果可以制作上面的变量就足够简单了),然后稍后,RE -打开这些进程(使用原始路径中的命令行参数。这是我迷路的地方。

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

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

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

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

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

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

谢谢..

【问题讨论】:

  • 如果 EXE 文件是控制台程序(基于文本),START 将打开一个新窗口。如果 EXE 文件是 GUI 程序,START 不会打开新窗口。强制使用/B 参数而不等待控制台程序完成(没有/WAIT)会导致输入冲突,因为CMD 和程序都在同一个窗口中运行,并且任何输入都将同时提供给两者。

标签: variables batch-file cmd


【解决方案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,但您可以使用列表调用:for (process1 process2 process3),或将其替换为 for /f 以提供文件中的值。如果要使用带引号的名称,则必须从下一行删除引号 (description^="%%C")。
第二个for 确实有效:它获取与描述匹配的所有进程的列表,并依次停止和启动每个进程。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2012-01-26
    • 2014-06-24
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多