0

编辑:我有专有应用程序,它只支持使用参数执行 Windows 命令和可执行文件(仅来自 Windows 文件夹),我需要使用它创建文件夹,但我不想看到 cmd 窗口闪烁。此应用程序不支持任何 dll 导入或代码自定义。

有没有办法在没有命令提示符的情况下在 Windows 中创建文件夹?当我跑

cmd /C mkdir "C:\Path\To\Dir" 

它会导致快速显示和隐藏 cmd 窗口的闪烁(我想避免这种情况)。当我跑

rundll.exe shell32.dll,SHCreateDirectory "C:\Path\To\Dir" 

或者

rundll.exe kernel32.dll,CreateDirectoryA "C:\Path\To\Dir" 

命令通过就好了,但没有创建我想要创建的目录。最好有这样的命令来创建具有完整不存在路径的目录。

EDIT2:我发现有点讨厌,但解决了这个问题:我发现我可以使用该专有应用程序创建文本文件。所以首先我创建了文件:run.vbs 然后我在里面写了几行:

If WScript.Arguments.Count >= 1 Then
    ReDim arr(WScript.Arguments.Count-1)
    For i = 0 To WScript.Arguments.Count-1
        Arg = WScript.Arguments(i)
        If InStr(Arg, " ") > 0 Then Arg = """" & Arg & """"
      arr(i) = Arg
    Next
    RunCmd = Join(arr)
    CreateObject("Wscript.Shell").Run RunCmd, 0, True
End If

然后运行

wscript run.vbs cmd /C mkdir "C:\Temp\TmP"

哇哦!

4

1 回答 1

3

如果您无法控制流程的创建方式,那么您基本上就处于该代码实施者的困境中。winapi CreateProcess确实运行 *.bat 和/或 *.cmd 文件,但通过 %ComSpec% /c,通常是 cmd.exe /c。但是,.bat 文件在这里不是 .good 正是因为 cmd 运行它们,这会打开一个控制台

以下是一些可能或可能不适用于您的情况的选项:

选项 1(来自@HarryJohnston 的想法)

使用以下 powershell 命令

powershell -WindowStyle Minimized -NoLogo -NoProfile -NonInteractive -Command mkdir c:\your\path\tocreate > %temp%\scratch.txt

选项 2

让脚本解释器运行以下文件:

Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

' Create a new folder
oFSO.CreateFolder WScript.Arguments.Item(0)

您可以从以下命令开始:

wscript mkdirsil.vbs "c:\path\to\create" //NoLogo

//Nologo 防止logo显示:执行时不显示banner

选项 3

编译以下保持其主窗口隐藏的 C# Winforms 程序。您需要部署可执行文件,我不知道这是否可行。

using System;
using System.Windows.Forms;
using System.IO;

namespace SilentMkDir
{
    public class Program:Form
    {
        public Program(string dir)
        {
            this.SuspendLayout();
            this.ClientSize = new System.Drawing.Size(0, 0);
            this.ControlBox = false;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.ShowIcon = false;
            this.ShowInTaskbar = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Text = "MakeDir";
            this.WindowState = System.Windows.Forms.FormWindowState.Minimized;
            this.Load += (s, e) =>
            {
                try
                {
                    Directory.CreateDirectory(dir);
                }
                catch (Exception all)
                {
                    MessageBox.Show(all.Message);
                }
                this.Close();
            };
            this.ResumeLayout(false);
        }

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] path)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Program(path[0]));
        }
    }
}

这个命令行应该为你生成一个*.exe,假设上面的代码在mksil.cs

csc mksil.cs /r:System.IO.dll /r:System.Windows.dll

或者你可以在 C/C++ 中创建类似的东西。

选项4(想法@eryksun)

安装 Python 后,您可以这样做

pyw -c "import os; os.mkdir(r'C:\Path\To\Dir')"

因为 pyw.exe 是一个 GUI 应用程序

您基本上是在寻找一个 Windows GUI 应用程序而不是控制台应用程序的 exe。以下批处理命令扫描系统文件夹以查找此类可执行文件(将其放在一行),但没有找到。(注意这需要从命令行运行,从脚本文件使用 %%a 而不是 % dumpbina。VC++ 编译器附带

for %a in (%SystemRoot%\System32\*.exe) do 
      @(dumpbin /headers %a | 
        find "subsystem (Windows GUI)" > nul && 
        echo %~nxa)

选项不可能

最初我希望start可以工作,但@HarryJohnston 指出它是 cmd 的内部命令而不是 exe。

start /B /min cmd /c mkdir

启动一个单独的窗口以运行指定的程序或命令。

但是使用 /B (没有新窗口)和 /MIN (最小化)你可能会逃脱它。

于 2015-03-04T21:14:46.493 回答