如果您无法控制流程的创建方式,那么您基本上就处于该代码实施者的困境中。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 而不是 % dumpbin
a。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 (最小化)你可能会逃脱它。