如何运行PowerShell脚本而不向用户显示窗口或任何其他符号?
换句话说,脚本应该在后台安静地运行,而不需要向用户发出任何信号。
不使用第三方组件的答案可获得额外分数:)
如何运行PowerShell脚本而不向用户显示窗口或任何其他符号?
换句话说,脚本应该在后台安静地运行,而不需要向用户发出任何信号。
不使用第三方组件的答案可获得额外分数:)
当前回答
我从c#运行时遇到了这个问题,在Windows 7上,“交互式服务检测”服务在以SYSTEM帐户运行隐藏的powershell窗口时弹出。
使用"CreateNoWindow"参数可以防止ISD服务弹出警告。
process.StartInfo = new ProcessStartInfo("powershell.exe",
String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
WorkingDirectory = executablePath,
UseShellExecute = false,
CreateNoWindow = true
};
其他回答
创建一个调用PowerShell脚本的快捷方式,并将Run选项设置为最小化。这将防止窗口闪烁,尽管您仍然会在任务栏上运行脚本的瞬间闪烁。
下面是一行代码:
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")
虽然这可能会让窗口非常短暂地闪现,但这种情况应该很少发生。
换句话说,脚本应该在后台安静地运行,而不需要向用户发出任何信号。 不使用第三方组件的答案可获得额外分数:)
我找到了一种方法,通过将PowerShell脚本编译为Windows可执行文件来实现这一点。需要第三方模块来构建可执行文件,但不需要运行它。我的最终目标是编译一行PowerShell脚本,在我的系统上弹出DVD:
(New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()
我的目标系统是Windows 7。具体的WMF更新需要根据Windows版本有所不同:
下载并安装WMF 5.1包
所需的PowerShell模块应该适用于任何Windows版本。以下是我用来安装必要模块和编译exe的确切命令。您需要调整驱动器,目录和文件名的详细信息为您的系统:
mkdir i:\tmp\wmf
cd i:\tmp\wmf
pkunzip ..\Win7AndW2K8R2-KB3191566-x64.zip
c:\windows\system32\windowspowershell\v1.0\powershell.exe
Set-ExecutionPolicy RemoteSigned
.\Install-WMF5.1.ps1
<click> "Restart Now"
c:\Windows\System32\WindowsPowerShell\v1.0\powershell -version 3.0
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
Install-Module -Name ps2exe -RequiredVersion 1.0.5
ps2exe i:\utils\scripts\ejectDVD.ps1 -noConsole
为了方便命令行使用,有一个简单的包装器应用程序:
https://github.com/stax76/run-hidden
命令行示例:
run-hidden powershell -command calc.exe
我真的厌倦了通过答案,却发现它没有像预期的那样工作。
解决方案
创建vbs脚本运行一个隐藏的批处理文件,该文件将启动powershell脚本。为这个任务制作3个文件似乎很愚蠢,但至少总大小小于2KB,它从任务器或手动运行完美(你看不到任何东西)。
scriptName.vbs
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Users\leathan\Documents\scriptName.bat" & Chr(34), 0
Set WinScriptHost = Nothing
scriptName.bat
powershell.exe -ExecutionPolicy Bypass C:\Users\leathan\Documents\scriptName.ps1
scriptName.ps1
Your magical code here.