Создать папку без использования cmd.exe в Windows

РЕДАКТИРОВАТЬ: У меня есть проприетарное приложение, которое поддерживает только выполнение команд и исполняемых файлов 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" 

Команда проходит нормально, но не нужно создавать каталог, который я хотел создать. Было бы хорошо иметь такую ​​команду и для создания директории с полным несуществующим путем.

РЕДАКТИРОВАТЬ 2: Я нашел немного неприятный, но рабочий обходной путь для этой проблемы: я обнаружил, что я могу создавать текстовые файлы с помощью этого проприетарного приложения. Итак, сначала я создал файл: 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"

И Вуола!

1 ответ

Если вы не можете контролировать, как создается ваш процесс, вы в основном находитесь в руках тех, кто реализует этот код. 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 Prevent: баннер не будет отображаться во время выполнения

Вариант 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 это приложение с графическим интерфейсом

Вы в основном ищете exe, который является Windows GUI-приложением, а не консольным приложением. Следующая пакетная команда сканирует системную папку на наличие таких исполняемых файлов (поместите ее в одну строку), но они не были найдены. (обратите внимание, что это нужно запустить из командной строки, из файла сценария используйте %%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 (минимизировано) вы можете сойти с рук.

Другие вопросы по тегам