【问题标题】:Invoke cygwin commands from my application, avoiding the DOS shell从我的应用程序调用 cygwin 命令,避免使用 DOS shell
【发布时间】:2013-05-11 06:59:05
【问题描述】:

我喜欢使用 cygwin 的“文件”命令扫描一组文件。我喜欢在我自己的程序中调用这个命令。

该程序是用 REALbasic (RB) 编写的,它类似于 Visual Basic(例如,具有类似的方式将 DLL API 与“declare”语句接口)。

RB 带有一个Shell 类,可以让我调用“DOS”命令类型的工具。我知道我可以使用它来调用 cygwin shell(例如 sh 或 bash,如建议的 here),然后我告诉它调用“文件”命令。这对我来说似乎效率很低,因为每次我想调用它的文件工具时它都会加载 bash shell。

但是,我想知道 cygwin 安装附带的 dll 是否提供对其命令 shell 的直接访问。通过这种方式,我希望加快速度,因为我希望加载它的 shell 一次,然后根据需要调用文件 cmd。

也许甚至有一个 VB 类已经这样做了,然后我可以将其移植到 RB?不过,我还没有找到类似的东西。

【问题讨论】:

    标签: cygwin realbasic


    【解决方案1】:

    事实证明这很容易:

    只需使用其完整路径调用该工具,例如"C:\cygwin\bin\file.exe"。

    我被很多谷歌搜索的建议误导了,这些建议表明我需要调用 shell 才能使用文件命令,而我什至没有先尝试这种直接方法。

    唯一的(小)挑战是以 POSIX 格式将任何路径传递给该工具。 REALbasic 只给了我 DOS 风格的路径格式(例如来自 FolderItem.AbsolutePath),而 cygwin 工具通常会用警告来抱怨这一点。我找到了解决方案:

    在 cygwin 安装中禁用警告。这是通过设置环境变量选项“nodosfilewarning”来完成的。

    另一种方法是提供正确的 POSIX 路径。 cygwin1.dll 为此提供了一个函数(''cygwin_conv_path''),但我无法在 RB 中使用它。相反,我写了自己的,希望它涵盖所有情况:

    dim objPath as String = f.AbsolutePath
    if objPath.Mid(2,2) = ":\" then
      objPath = "/cygdrive/"+objPath.Mid(1,1).Lowercase+objPath.Mid(3).ReplaceAll("\","/")
    end if
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 2017-10-24
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2012-02-25
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多