我目前通过一个.bat文件打开我的PowerShell脚本。这个脚本有一个图形用户界面(GUI)。我试图将以下代码放入我的脚本中,但它隐藏了GUI并且一直循环执行,因为我希望我的GUI持续循环:
powershell.exe -WindowStyle Hidden -file c:\script.ps1
我们如何在不使用命令提示符的情况下运行脚本,但同时又不隐藏 GUI?如果我们使用 .bat 文件运行脚本,情况是否相同?谢谢!
我目前通过一个.bat文件打开我的PowerShell脚本。这个脚本有一个图形用户界面(GUI)。我试图将以下代码放入我的脚本中,但它隐藏了GUI并且一直循环执行,因为我希望我的GUI持续循环:
powershell.exe -WindowStyle Hidden -file c:\script.ps1
如果您想将控制台隐藏在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_Load
事件中调用Hide-Console
函数:
$OnFormLoad =
{
Hide-Console
}
如果您需要显示控制台,可能是为了调试,您可以通过调用 Show-Console
函数轻松地再次显示控制台:
$OnButtonClick =
{
Show-Console
}
ShowWindow
的数字的更多信息,请参阅此处的 MSDN 上的 ShowWindow 文档。Hide-Console
。由于您已经在 Shown
事件 ($objForm.Add_Shown
) 中编写了代码,我们只需要添加另一行来调用该命令:$objForm.Add_Shown({$objForm.Activate()})
变成这样:
$objForm.Add_Shown({
$objForm.Activate()
Hide-Console
})
当你的表单被 展示
时,控制台将会被隐藏(如果你想要之后查看它仍然可以调用 Show-Console
)。
$objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog()
。 - DrixlReyC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -windowstyle Hidden -file "C:\path\whatever.ps1"
$argumentlist = "/c powershell.exe -file `"c:\path\whatever2.ps1`" -param1 `"paramstring`""
Start-Process cmd.exe -WindowStyle Hidden -ArgumentList $argumentlist
param (
[Parameter(Mandatory=$true)]
[string]$var1
)
$argumentlist = "/c powershell.exe -file `"C:\path\whatever2.ps1`" -param1 `"param1string`""
简化了显示/隐藏函数的一点内容
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)
}
}
虽然Bluecakes的答案很好,但可以简化一下。没有必要使用kernel32.dll
中的GetConsoleWindow()
函数来获取控制台窗口句柄。可以通过Process
类的MainWindowHandle
属性获取,而进程本身是由Get-Process
命令返回的,其中传递了自动变量$pid
作为参数。以下是一个示例,仅隐藏当前控制台窗口:
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)
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)
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -file "\\location\folder1\script.ps1"
。 - DrixlRey