【问题标题】:Converting a for loop from Batch to Git Bash [closed]将 for 循环从 Batch 转换为 Git Bash [关闭]
【发布时间】:2021-11-07 06:54:15
【问题描述】:

我一直被困在 Windows 脚本中的特定 for 循环中,我找不到任何关于如何将其转换为 git Bash 等效项的帮助。代码在这里:

FOR /F "usebackq tokens=2" %%i IN (`tasklist /v ^| findstr /c:"IRCam_Data_Collector"`) DO taskkill /pid %%i

如果我将它更改为标准 shell,它会给出一个错误

意外标记 `"tokens=2 delims=,"' 附近的语法错误

我的转换后的shell代码版本:

for //f "tokens=2 delims=," %i in (`tasklist //v | findstr //c:"IRCam_Data_Collector"`); do taskkill //pid %i; done

任何帮助将不胜感激。是的,我知道 Git Bash 与 bash 不同。我发现它必须与爆炸变量迭代“For /f”有关。由于我没有使用 Git Bash 的经验,因此我寻求帮助

【问题讨论】:

  • (Git) Bash 非常与 Batch 不同。您不能只更改几个字符并期望它起作用。
  • 是的,我知道。我发现它必须与爆炸变量迭代“For /f”有关。由于我没有使用 Git Bash 的经验,因此我寻求帮助
  • 标准 bash 甚至没有 taskliskfindstrtaskkill 这样的东西(尽管如果在解释器的 PATH 中有 Windows 原生可执行文件,它们可能是可用的即使是这样)。将其分解,将其分解成小块并测试每个个体是否有效,这将有很多好处;否则,有人需要拥有自己的 Windows 机器才能回答这个问题或测试其他人答案的正确性。
  • 很抱歉给您带来麻烦。我对 windows bash 和批处理非常陌生。这根本不是我的魔咒,但是由于 SIEMENS IPC 的一些限制,我不得不使用 Windows 而不是 Linux,并且当 git repo 中有更新时需要这个脚本来终止我的 python 脚本

标签: bash batch-file git-bash


【解决方案1】:

这应该达到你的预期:

#!/usr/bin/env bash

for pid in $(tasklist //v | awk '/IRCam_Data_Collector/{print $2}'); do
    echo taskkill //F //pid $pid
done

看到 echo 符合您的要求后,请删除它。

【讨论】:

  • 为什么是//v?正斜杠不需要加倍,OP的原始批处理代码没有这样做。
  • @CharlesDuffy 你可以在他的bash 尝试中看到,// 无处不在。如果没有双斜杠,git-bash 会尝试将其作为 windows 目录。
  • 啊!忘记了msys-isms;我以为 OP 正在考虑反斜杠并错误地将它们加倍。
  • 如果你做tasklist //v,你能看到IRCam_Data_Collector作为一行的第一个元素。尝试运行 tasklist //v | awk '/IRCam_Data_Collector/{print $2}'(删除 ^)
  • ^ 使其在行首匹配。我认为 IRCam_Data_Collector 是您的可执行文件的名称。答案已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多