我目前通过.bat文件打开我的PowerShell脚本。该脚本具有GUI。我试着将它放在我的脚本中,但它也隐藏了GUI并且还保持循环,因为我希望我的GUI不断循环:
powershell.exe -WindowStyle Hidden -file c:\script.ps1
我们如何在没有Command Promp的情况下运行脚本,但也不隐藏gui?如果我们使用.bat文件运行脚本,那是相同的吗?谢谢!
答案 0 :(得分:10)
如果您想隐藏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)
}
将上述功能添加到您的表单后,只需致电Hide-Console
活动中的Form_Load
功能:
$OnFormLoad =
{
Hide-Console
}
如果您需要显示控制台,可能需要调试,您可以通过调用Show-Console
函数轻松再次显示控制台:
$OnButtonClick =
{
Show-Console
}
有关您可以传递给ShowWindow
的号码的详细信息,请查看ShowWindow documentation on MSDN here
根据评论进行更新
感谢您提供此代码。我尝试在我的脚本中使用它,但我想在哪里放置Hide-Console?我的表单加载看起来像$ objForm.Add_Shown({$ 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
。)
答案 1 :(得分:0)
如果从窗口设置为最小化的快捷方式运行PowerShell,它将在任务栏中短暂闪烁一个cmd图标,但您几乎没有注意到它。然而,它将启动您的PowerShell GUI而不需要它背后的控制台窗口。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle Hidden -file "C:\path\whatever.ps1"
如果你想从whatever.ps1启动第二个GUI控制台窗口而不停止对whatever.ps1的处理,你需要使用start-process。但是,隐藏-WindowStyle的启动过程会阻止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
作为奖励,如果你使用param()语句启动whatever2.ps1,你可以传递命名的必需参数。在组装之前,确保它是ps1文件中的第一件事。
param (
[Parameter(Mandatory=$true)]
[string]$var1
)
$argumentlist = "/c powershell.exe -file `"C:\path\whatever2.ps1`" -param1 `"param1string`""
答案 2 :(得分:0)
简化了显示隐藏功能
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)
}
}
答案 3 :(得分:0)
在建议的解决方案中发表评论(*
将其放入快捷方式而不是批处理文件中。右键单击空白 在桌面或文件夹窗口中找到,新建,快捷方式,粘贴您的行 在,接下来,命名它,完成
*。)绝对隐藏我设置的命令提示符(在常规中,Run = minimized的快捷方式)。