Answers:
您可以像这样运行它(但是这会显示一个窗口):
PowerShell.exe -windowstyle hidden { your script.. }
或者您使用我创建的帮助程序文件来避免名为PsRun.exe的窗口执行此操作。您可以下载源文件和exe文件,并在PowerShell中使用WinForm GUI运行计划的任务。我将其用于计划任务。
编辑:正如Marco所指出的,此-windowstyle参数仅适用于V2。
-WindowStyle Hidden
将该任务设置为Run whether user is logged on or not
“安全选项”部分下的“常规”选项卡。
您可以使用PowerShell社区扩展,并执行以下操作:
start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden
您也可以使用VBScript执行此操作:http : //blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/
计划隐藏的PowerShell任务(Internet存档)
计划内的PowerShell带来更多乐趣(Internet存档)
(通过此论坛主题。)
这是一种不需要命令行参数或单独启动器的方法。它不是完全不可见的,因为启动时窗口确实会瞬间显示。但是它很快就消失了。我认为,这是最简单的方法,如果您想通过双击资源管理器或通过“开始”菜单快捷方式(当然包括“启动”子菜单)来启动脚本。我喜欢它是脚本本身代码的一部分,而不是外部代码。
将其放在脚本的前面:
$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $t -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)
这里是单线:
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")
尽管这可能会使窗口短暂闪烁,但这很少见。
在Windows 7上从c#运行时遇到此问题,当以系统帐户运行隐藏的Powershell窗口时,“交互服务检测”服务弹出。
使用“ CreateNoWindow”参数可防止ISD服务弹出警告。
process.StartInfo = new ProcessStartInfo("powershell.exe",
String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
WorkingDirectory = executablePath,
UseShellExecute = false,
CreateNoWindow = true
};
我认为,运行后台脚本时隐藏PowerShell控制台屏幕的最佳方法是此代码(“ Bluecakes ”答案)。
我将此代码添加到需要在后台运行的所有PowerShell脚本的开头。
# .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 Hide-Console
{
$consolePtr = [Console.Window]::GetConsoleWindow()
#0 hide
[Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console
如果此答案对您有帮助,请在此帖子的答案中投票给“ Bluecakes”。
我创建了一个小工具,将调用传递到您要从无窗口启动的任何控制台工具,并传递到原始文件:
https://github.com/Vittel/RunHiddenConsole
编译后,只需将可执行文件重命名为“ <targetExecutableName> w.exe”(附加“ w”),然后将其放在原始可执行文件旁边。然后,您可以使用常规参数调用eG powershellw.exe,它不会弹出一个窗口。
如果有人对如何检查所创建的进程是否正在等待输入有所了解,不高兴包括您的解决方案:)
MessageBox
不使用任何窗口闪烁的情况下运行Powershell脚本,则这是最佳答案(要求将EXE编译为Winexe,而不是控制台应用程序,并且要求将Task Scheduler设置为“仅在登录用户时运行”) on”,因此对话框将在当前桌面会话中显示。)感谢您执行此操作,powershellw.exe多年来一直是我的愿望清单!
这是Windows 10中不包含任何第三方组件的有效解决方案。通过将PowerShell脚本包装到VBScript中可以工作。
步骤1:我们需要更改某些Windows功能,以允许VBScript运行PowerShell并默认情况下使用PowerShell打开.ps1文件。
-运行并输入“ regedit”。单击确定,然后使其运行。
-粘贴此路径“ HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell”,然后按Enter。
-现在打开右侧的条目并将其值更改为0。
-以管理员身份打开PowerShell,并键入“ Set-ExecutionPolicy -ExecutionPolicy RemoteSigned”,按Enter,并用“ y”确认更改,然后输入。
步骤2:现在我们可以开始包装脚本了。
-将Powershell脚本另存为.ps1文件。
-创建一个新的文本文档并粘贴此脚本。
Dim objShell,objFSO,objFile
Set objShell=CreateObject("WScript.Shell")
Set objFSO=CreateObject("Scripting.FileSystemObject")
'enter the path for your PowerShell Script
strPath="c:\your script path\script.ps1"
'verify file exists
If objFSO.FileExists(strPath) Then
'return short path name
set objFile=objFSO.GetFile(strPath)
strCMD="powershell -nologo -command " & Chr(34) & "&{" &_
objFile.ShortPath & "}" & Chr(34)
'Uncomment next line for debugging
'WScript.Echo strCMD
'use 0 to hide window
objShell.Run strCMD,0
Else
'Display error message
WScript.Echo "Failed to find " & strPath
WScript.Quit
End If
-now,将文件路径更改为.ps1脚本的位置,然后保存文本文档。
-现在,右键单击文件,然后重命名。然后将文件扩展名更改为.vbs,然后按Enter,然后单击“确定”。
完成!如果现在打开.vbs,则在后台运行脚本时应该看不到任何控制台窗口。
如果适合您,请确保投票!
这是一个有趣的演示,它控制控制台的各种状态,包括最小化和隐藏状态。
Add-Type -Name ConsoleUtils -Namespace WPIA -MemberDefinition @'
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'@
$ConsoleMode = @{
HIDDEN = 0;
NORMAL = 1;
MINIMIZED = 2;
MAXIMIZED = 3;
SHOW = 5
RESTORE = 9
}
$hWnd = [WPIA.ConsoleUtils]::GetConsoleWindow()
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MAXIMIZED)
"maximized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.NORMAL)
"normal $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MINIMIZED)
"minimized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.RESTORE)
"restore $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.HIDDEN)
"hidden $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.SHOW)
"show $a"