从Linux .net核心consol应用程序调用命令时遇到一些问题。
Sub Main()
Dim PI As New ProcessStartInfo
Using Proc As New Process
With PI
.FileName = "cat"
.Arguments = "/etc/*-release"
.RedirectStandardOutput = True
.UseShellExecute = False
.CreateNoWindow = True
End With
Proc.StartInfo = PI
Proc.Start()
PI = Nothing
Console.Write(Proc.StandardOutput.ReadToEnd)
End Using
End Sub
我收到此错误:
cat: '/etc/*-release': No such file or directory
如果我禁用重定向并设置UseShellExecute = True,它可以工作,但我希望能够在我的代码中使用输出。
答案 0 :(得分:1)
运行
之类的命令时cat /etc/*-release
linux shell(可能是bash)评估每个参数,然后使用评估的参数调用程序。简单的单词评估自己,但变量(如$SOME_ARGUMENT
)和模式(如*
)计算值和文件名。所以shell真正评估上面的内容(假设只有一个文件):
cat /etc/os-release
因此cat
程序只获得一个参数 - 没有像*
这样的全局。
如果您想在程序中模拟该行为,则需要将UseShellExecute
设置为True
。
或者,也许你可以自己做评估。像Directory.EnumerateFiles
这样的API允许您这样做:
Dim textFiles = Directory.EnumerateFiles("/etc/", "*-release")
然后,您需要遍历此集合并使用确切的文件名作为.Arguments
值。
编辑:但是为了更进一步,你为什么要尝试这样做?如果您已完整阅读该文件,请拨打cat
。为什么不只是Console.WriteLine()
文件本身而不是调用cat
?
答案 1 :(得分:0)
啊......明白了!
我只需要使用bash -c ""cat ""/etc/*-release""""
Sub Main()
Dim PI As New ProcessStartInfo
Using Proc As New Process
With PI
.FileName = "bash"
.Arguments = "-c ""cat ""/etc/*-release"""""
.RedirectStandardOutput = True
.UseShellExecute = False
.CreateNoWindow = True
End With
Proc.StartInfo = PI
Proc.Start()
PI = Nothing
Console.Write(Proc.StandardOutput.ReadToEnd)
End Using
End Sub