Создать папку без использования 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 (минимизировано) вы можете сойти с рук.