在Windows中不使用cmd.exe创建文件夹

时间:2015-03-04 19:54:23

标签: windows cmd rundll32

编辑:我有专有应用程序,它只支持使用参数执行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"

和vuola!

1 个答案:

答案 0 :(得分:3)

如果您无法控制流程的创建方式,那么您基本上就是该代码实施者的代表。 winapi CreateProcess确实运行* .bat和/或* .cmd文件,但是通过%ComSpec%/ c,通常是cmd.exe / c。但是,.bat文件在这里并不是很好。因为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防止徽标显示:执行时不会显示横幅

选项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而不是%a。dumpbin附带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(最小化)你可能会使用它。