【问题标题】:C# command-line arguments and lsC# 命令行参数和 ls
【发布时间】:2023-09-27 08:41:01
【问题描述】:

我正在使用 MSYS 在 Windows 上获得一些理智的可编写脚本的外壳 :)。

现在我正在编写一个用 C# 编写的控制台应用程序,它接受许多参数并在对话框中将这些参数作为选项呈现给用户。实际选项对应于文件名,我用 ls 检索。

但是,当我的文件名中包含空格时,就会出现问题。假设我有文件名为:

file name
with spaces

在名为 foo 的目录中,我的 C# 可执行文件名为 bar,在其中我检查“argv”数组的内容(即传递给我的应用程序的命令行参数,由 .NET 解释)。

当我调用它时会发生以下奇怪:

./bar.exe "文件名" "带空格" -->

file name
with spaces

./bar.exe $(ls foo) -->

file
name
with
spaces

./bar.exe $(ls -Q foo) -->

"file
name"
"with
spaces"

有人知道这里发生了什么吗?显然,.NET 没有正确解析 bash 或 ls 传递的参数。

但即使我添加引号,引号也包含在参数中,而不是将两个参数合并为一个。

有没有办法让我进入未处理的命令行,这样我就可以查看控制字符或其他东西是否发生了奇怪的事情?

任何见解将不胜感激!

【问题讨论】:

    标签: c# .net bash ls msys


    【解决方案1】:

    您可以使用Environment.CommandLine 获取原始命令。不知道 bash 的东西,抱歉;可能涉及行尾(CR vs LF vs CRLF vs LFCR)。

    【讨论】:

      【解决方案2】:

      我认为问题在于您在命令行中传递参数,而命令行将每个单词读取为单独的 Parameter , ;尝试做“文件名”“带空格”..
      如果您通过代码传递它使用

      ProcessStartInfo.Arguments = "\"File Name \"" ;
      

      作为您的流程的参数

      【讨论】:

        【解决方案3】:

        我在我的项目中使用了这个 RegawMOD.Android

        Device device = android.GetConnectedDevice(android.ConnectedDevices[0]);
        
        objArray = new object[] { "ls", string.Concat("/sdcard/")) };
        
        str = Adb.ExecuteAdbCommand(Adb.FormAdbCommand(device, "shell", objArray));
        // or 
        // str= Adb.ExecuteAdbCommand(Adb.FormAdbCommand("shell",objArray));
        

        更多命令选项请查看Commands

        【讨论】:

        • @Rahil 编辑并没有使帖子变得更好。用户:你好像没看懂这个问题。
        • @CodeCaster 我不确定device Class 实例。
        • 我的意思是空白更改,@Lorenzo 的编辑也是如此。这篇文章的格式很好,插入随机换行符不会变得更具可读性。