【问题标题】:issue running a batch script to kill a process运行批处理脚本以终止进程的问题
【发布时间】:2011-07-14 06:39:33
【问题描述】:

我在命令行上使用以下脚本来终止假设的记事本进程(在 Windows XP 中使用 KornShell (ksh),如果这很重要的话):

kill $(tasklist | grep -i notepad.exe | awk '{print 2}')

现在我将这一行放入批处理文件 c:\temp\testkill.bat 中,我认为我也应该能够通过运行批处理文件来终止进程。但是,当我运行批处理文件时,我收到以下关于不平衡括号的 awk 错误:

C:/Temp> ./testkill.bat

C:\Temp>kill $(tasklist | grep -i notepad.exe | awk '{print $2}')
awk: unbalanced() 上下文是:
>>> {打印 $2}) C:/温度>

所以我很困惑为什么当我通过批处理文件运行此脚本时会收到关于不平衡括号的错误,但是当我直接从命令行运行命令时却没有问题?

(我不一定与这种杀死进程的方式有关 - 我还想知道为什么我在命令行上写以下内容:

任务列表 | grep -i notepad.exe | awk '{打印 $2}' |杀死

来自 tasklist/grep/awk 调用的进程 ID 似乎没有被正确地通过管道杀死。

【问题讨论】:

    标签: batch-file process awk ksh kill


    【解决方案1】:

    如果您有 Korn shell,为什么要制作批处理文件?编写一个 shell 脚本 - 这可能会对您有很大帮助。

    我可以回答您的最后一个问题 - kill 不会从标准输入中获取 PID,而是在命令行中获取它。您可以使用xargs 使其工作:

    tasklist | grep -i notepad.exe | awk '{print $2}' | xargs kill
    

    【讨论】:

    • 感谢@carl-norum 的回复。您对 xargs 的提及确实解决了我的第二个问题。但是,如果我现在将带有 xargs 的这一行放入批处理文件中,而我没有收到错误,则该进程不会被终止。我是个新手——对于这么简单的事情,我不确定我是否理解将这一行放在批处理文件中与 shell 脚本有什么区别?例如,如果我调用这个文件 testkill.sh 并从命令行运行“sh testkill.sh”,我仍然会遇到同样的问题,即没有错误,但进程没有被杀死。
    • @user657064 - 你是如何运行 Korn shell 的?例如,我认为 cygwin 的 PID 不一定与 Windows 的进程 ID 一致。
    • @carl-norum:我通过 MKS Toolkit 运行 Korn shell。在完全相同的 Korn shell 会话中,我可以打开 Windows 记事本,运行您编写的命令,它会终止记事本进程,但如果我重新打开记事本然后运行批处理文件或 shell 脚本,记事本不会被杀死.我原以为用 grep / awk 解析任务列表的意义在于,无论它的 PID 是多少,我都可以终止该进程。此外,当我运行 ps 而不是 tasklist 时,我得到了相同的 PID。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2012-11-17
    • 2015-05-08
    • 1970-01-01
    • 2011-06-15
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多