打开PowerShell脚本并隐藏命令提示符,但不隐藏GUI

vaqhlq81  于 2023-04-30  发布在  Shell
关注(0)|答案(6)|浏览(261)

我目前通过一个打开我的PowerShell脚本。bat文件。该脚本具有GUI。我试着把它放在我的脚本中,但它也隐藏了GUI,并且还一直循环,因为我希望我的GUI不断循环:

powershell.exe -WindowStyle Hidden -file c:\script.ps1

我们如何在不使用Command Promp的情况下运行脚本,同时又不隐藏GUI?如果我们使用。 bat 档案?谢谢!

nr9pn0ug

nr9pn0ug1#

如果你想隐藏GUI后面的控制台,我已经成功地使用了以下本机函数:

# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'

function Show-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()

    # Hide = 0,
    # ShowNormal = 1,
    # ShowMinimized = 2,
    # ShowMaximized = 3,
    # Maximize = 3,
    # ShowNormalNoActivate = 4,
    # Show = 5,
    # Minimize = 6,
    # ShowMinNoActivate = 7,
    # ShowNoActivate = 8,
    # Restore = 9,
    # ShowDefault = 10,
    # ForceMinimized = 11

    [Console.Window]::ShowWindow($consolePtr, 4)
}

function Hide-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()
    #0 hide
    [Console.Window]::ShowWindow($consolePtr, 0)
}

将上述函数添加到Form后,只需在Form_Load事件中调用Hide-Console函数:

$OnFormLoad = 
{
    Hide-Console
}

如果您需要显示控制台,也许是为了调试,您可以通过调用Show-Console函数轻松地再次显示控制台:

$OnButtonClick = 
{
    Show-Console
}

有关可以传递给ShowWindow的数字的更多信息,请查看ShowWindow documentation on MSDN here

根据评论更新

谢谢这个代码。我试着在我的脚本中使用它,但是我应该把Hide-Console放在哪里呢?我的表单加载看起来像这个$objForm。Add_Showed({$objForm.Activate()})[void] $objForm。ShowDialog()
要使用此代码隐藏控制台,您需要做的就是调用Hide-Console。因为你已经有了Shown事件($objForm.Add_Shown)中的代码,我们可以简单地添加另一行来调用命令:
更改此:

$objForm.Add_Shown({$objForm.Activate()})

对此:

$objForm.Add_Shown({
    $objForm.Activate()
    Hide-Console
})

当你的表单是Shown时,控制台将被隐藏(如果你以后想看到它,你仍然可以调用Show-Console)。

ncgqoxb0

ncgqoxb02#

如果您从窗口设置为最小化的快捷方式运行PowerShell,它会在任务栏中短暂 Flink 一个cmd图标,但您几乎不会注意到它。然而,它将启动您的PowerShell GUI,而无需在其后面使用控制台窗口。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle Hidden -file "C:\path\whatever.ps1"

如果你想启动第二个GUI控制台窗口。ps1没有它停止处理任何东西。ps1你需要使用start-process.但是,隐藏了-WindowStyle的start-process会阻止GUI显示。移除-WindowStyle在GUI后面显示命令窗口。但是,如果您使用cmd启动进程。exe /k,它可以工作。

$argumentlist = "/c powershell.exe -file `"c:\path\whatever2.ps1`" -param1 `"paramstring`""
Start-Process cmd.exe -WindowStyle Hidden -ArgumentList $argumentlist

作为奖励,如果你开始什么2。使用param()语句的ps1,可以传递指定的必需参数。只要确保它是ps1文件中的第一件事,甚至在汇编之前。

param (
  [Parameter(Mandatory=$true)]
  [string]$var1
)
$argumentlist = "/c powershell.exe -file `"C:\path\whatever2.ps1`" -param1 `"param1string`""
0tdrvxhp

0tdrvxhp3#

在建议的解决方案中发表评论(*
把它放在一个快捷方式中,而不是放在批处理文件中。右键单击桌面或文件夹窗口中的空白点,新建,快捷方式,粘贴行,下一步,命名,完成

  • .)绝对隐藏命令提示符,我设置,在属性的快捷方式运行=最小化一般.
soat7uwm

soat7uwm4#

简化了显示隐藏的功能

function Show-Console
{
    param ([Switch]$Show,[Switch]$Hide)
    if (-not ("Console.Window" -as [type])) { 

        Add-Type -Name Window -Namespace Console -MemberDefinition '
        [DllImport("Kernel32.dll")]
        public static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
        '
    }

    if ($Show)
    {
        $consolePtr = [Console.Window]::GetConsoleWindow()

        # Hide = 0,
        # ShowNormal = 1,
        # ShowMinimized = 2,
        # ShowMaximized = 3,
        # Maximize = 3,
        # ShowNormalNoActivate = 4,
        # Show = 5,
        # Minimize = 6,
        # ShowMinNoActivate = 7,
        # ShowNoActivate = 8,
        # Restore = 9,
        # ShowDefault = 10,
        # ForceMinimized = 11

        $null = [Console.Window]::ShowWindow($consolePtr, 5)
    }

    if ($Hide)
    {
        $consolePtr = [Console.Window]::GetConsoleWindow()
        #0 hide
        $null = [Console.Window]::ShowWindow($consolePtr, 0)
    }
}

show-console -show

show-console -hide

liwlm1x9

liwlm1x95#

我也有同样的问题。我需要一个Winform显示没有控制台窗口显示。到目前为止,最简单的方法是打开另一个运行Winform的非隐藏窗口,然后隐藏自己。例如:
启动进程powershell。exe -windowstyle normal C:\SomePathToScript。ps1
上面的脚本。ps1文件将作为一种“启动器”为您的实际Winform脚本。
在这个“启动”脚本中:
powershell.exe -windowstyle hidden C:\Path\To\Winform\Script.ps1
在启动脚本中,一定要省略powershell前面的“start-process”。这就像是一种内置的隐藏效果。你会看到一个短暂的PowerShell窗口出现,然后它立即消失。

6rvt4ljy

6rvt4ljy6#

虽然the answer by Bluecakes很棒,但它可以简化一点。不需要使用kernel32.dll中的GetConsoleWindow()函数来获取控制台窗口处理程序。它可以通过MainWindowHandle property of the Process class获得,而进程本身由Get-Process cmdlet返回,the automatic $pid variable作为参数传递。下面是一个只隐藏当前控制台窗口的示例:

add-type -name user32 -namespace win32 -memberDefinition '[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);'
[win32.user32]::showWindow((get-process -id $pid).mainWindowHandle, 0)

请注意,上面的操作仅用于在加载GUI表单之前隐藏控制台。否则,表单将成为进程的主窗口,表单的句柄将由MainWindowHandle返回。如果你需要在窗体加载后操作控制台窗口,并且仍然避免使用kernel32.dll,你可以在一开始就将其句柄保存在一个变量中:

add-type -name user32 -namespace win32 -memberDefinition '[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);'
$consoleHandle = (get-process -id $pid).mainWindowHandle

# load your form or whatever ...

# hide console
[win32.user32]::showWindow($consoleHandle, 0)
# show console
[win32.user32]::showWindow($consoleHandle, 5)

相关问题