从我的应用程序中调用cygwin命令,避免使用DOS shell

从我的应用程序中调用cygwin命令,避免使用DOS shell,cygwin,realbasic,Cygwin,Realbasic,我喜欢使用cygwin的“file”命令扫描一组文件。我喜欢在自己的程序中调用这个命令 该程序是用REALbasic(RB)编写的,它类似于Visual Basic(例如,使用类似的方法将DLL API与“declare”语句进行接口) RB附带了一个Shell类,它允许我调用“DOS”命令类型的工具。我知道我可以用它来调用cygwinshell(如建议的sh或bash),然后我告诉它调用“file”命令。对我来说,这似乎效率很低,因为每次我想调用bashshell的文件工具时,它都会加载bas

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

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

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

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


也许有一个VB类已经完成了这项工作,我可以将它移植到RB?不过,我还没有找到类似的东西。

事实证明这很容易:

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

我被谷歌的许多建议误导了,这些建议建议我需要调用shell来使用file命令,而我甚至没有先尝试这种直接方法

唯一的(小的)挑战是以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