代码之家  ›  专栏  ›  技术社区  ›  Crash893

如何绕过命令行长度限制?

  •  17
  • Crash893  · 技术社区  · 16 年前

    我一直在研究一个小而简单的程序,我把文件放到它上面,根据特定的规则,它们被移动到不同的地方。

    除非我删除多个文件,否则程序工作正常,然后它会返回一个错误(似乎是更多的窗口),启动命令“c:\myapp.exe\file\file\file”太长。

    我意识到我可以设置一个后台进程,但是我真的希望这个程序不要在后台运行(在那里它大部分时间都是空闲的)。

    有没有办法克服这个限制?

    9 回复  |  直到 10 年前
        1
  •  14
  •   Oleg    16 年前

    如果要删除与Windows资源管理器相关的文件,则可以将自己的删除处理程序实现为外壳扩展处理程序(请参见 http://msdn.microsoft.com/en-us/library/cc144165(VS.85).aspx http://msdn.microsoft.com/en-us/library/bb776797.aspx )论 http://www.codeproject.com/kb/shell/shellextguideindex.aspx 你会发现一个很好的介绍如何写这样的扩展。第六部分(见 http://www.codeproject.com/kb/shell/ShellExtGuide6.aspx )给出了一个Drop处理程序的示例(对于其他一些用例,但这并不重要)。

    关于drop shell扩展处理程序,您的程序将接收有关所有已删除文件的完整信息,您不需要使用所有文件作为类似命令的参数来启动子程序。

        2
  •  14
  •   Adi Lester    12 年前

    this blog :

    • createProcess函数的最大命令行长度为32767个字符。这个限制来自unicode_字符串结构。
    • 如果您使用的是cmd.exe命令处理器,那么您还需要遵守由cmd.exe施加的8192字符命令行长度限制。
    • 如果您使用的是shellexecute/ex函数,那么您将受到shellexecute/ex函数所施加的Internet_max_url_length(大约2048)命令行长度限制的约束。
    • 环境的最大大小为32767个字符。环境的大小包括所有变量名和所有值。

    所以你必须解决一些上面提到的解决方法(同时,在我链接的msdn博客上还有另一个解决方法)。

        3
  •  2
  •   mdma    16 年前

    我认为拖放处理程序可能是一种方式,但它似乎相当沉重。

    另一种解决方案是使用资源管理器上下文菜单处理程序。安装好后,您将选择所有文件,但不是拖动它们,而是右键单击,然后选择新的菜单项“发送到”。

    当选择菜单项时,它会将命令列表传递给程序。有几种方法可以做到这一点:

    1. 启动程序,并将文件列表提供给标准输入
    2. 将文件列表写入一个临时文件,然后只使用一个命令参数启动程序-临时文件列出要处理的文件。列表文件通常在命令行上以“@”作为前缀,以区别于普通文件名。
        4
  •  1
  •   Tim Lloyd    16 年前

    将文件拖放到应用程序上后,将文件名列表写入文本文件,然后将此文件的位置提供给程序。然后目标程序可以读取这个文件并逐行处理它。这样,您只需传递一个文件名。

        5
  •  1
  •   Robert Williams    16 年前

    我将修改应用程序以从特定位置(例如文件系统上的特定文件夹)提取文件,而不是在命令行上指定每个文件。

    更新:

    如果要求能够通过Windows资源管理器将项目拖动到.exe上,以按上述标记启动应用程序,则可以将所有文件放到一个文件夹中,并将整个文件夹放到.exe上。

        6
  •  1
  •   Jesse Webb    16 年前

    我认为最简单的解决方案是修改应用程序以接受目录作为参数,而不是文件列表。这将允许您将多个文件复制到一个目录中。然后可以将文件夹拖放到可执行文件上。然后,它将运行一个类似“c:\myapp.exe\folder with files in it”的命令,该命令不应运行到您现在遇到的命令行参数限制中。

        7
  •  1
  •   Community Mohan Dere    9 年前

    我在尝试获取长路径上的安全细节时遇到了类似的问题。 我的解决方案是在路径长度过长时映射驱动器。查看我的解决方案 How do I get the security details for a long path?

        8
  •  1
  •   Jason    16 年前

    Unix命令通常有一个或两个参数的长度可以是无限的。其中一些命令添加了参数,这些参数可以从文件或标准输入中获取这些参数。因此,您有一个命令,它列出参数列表,并将它们通过管道发送到临时文件,或者将它们通过管道发送到stdout。

    另请参见xargs,它可以获取参数列表,并使用所有参数调用命令,或者批量调用命令。

        9
  •  1
  •   kurt    10 年前

    如何绕过命令行长度限制?将整个命令写入批处理文件,例如“c:\users\johnny\documents\mybatch.bat”。像在命令中那样写它(不需要转义任何东西)。然后,在代码中,只需调用该文件:

    strCmdText = "C:\\Users\\Johnny\\Documents\\mybatch.bat";
    
    ProcessStartInfo ProcessInfo = new ProcessStartInfo("cmd.exe", "/K " + strCmdText);
    ProcessInfo.CreateNoWindow = true;
    ProcessInfo.UseShellExecute = true;
    
    Process.Start(ProcessInfo);