विंडो प्रदर्शित किए बिना पॉवरशेल स्क्रिप्ट कैसे चलाएं?


127

उपयोगकर्ता को एक विंडो या किसी अन्य चिह्न को प्रदर्शित किए बिना पावरशेल स्क्रिप्ट चलाना कैसे संभव है ?

दूसरे शब्दों में, स्क्रिप्ट को उपयोगकर्ता को बिना किसी संकेत के पृष्ठभूमि में चुपचाप चलना चाहिए।

एक उत्तर के लिए अतिरिक्त क्रेडिट जो तीसरे पक्ष के घटकों का उपयोग नहीं करता है :)


इस प्रश्न की जाँच करें यदि आप सीखने में रुचि रखते हैं: stackoverflow.com/questions/573623/powershell-vs-unix-shells
थॉमस ब्राट

यह समाधान टास्क शेड्यूलर के लिए भी काम करता है: stackoverflow.com/a/51007810/571591
Hilydrow

जवाबों:


128

आप इसे या तो इस तरह से चला सकते हैं (लेकिन यह थोड़ी देर के लिए विंडोज़ दिखाता है):

PowerShell.exe -windowstyle hidden { your script.. }

या आप PsRun.exe नामक विंडो से बचने के लिए बनाई गई एक सहायक फ़ाइल का उपयोग करते हैं जो वास्तव में ऐसा करती है। आप स्रोत डाउनलोड कर सकते हैं और PowerShell में WinForm GUI के साथ शेड्यूल किए गए कार्यों को चला सकते हैं । मैं इसे अनुसूचित कार्यों के लिए उपयोग करता हूं।

संपादित: जैसा कि मार्को ने उल्लेख किया है कि यह -विंडोस्टाइल पैरामीटर केवल V2 के लिए उपलब्ध है।


6
हालाँकि, मैंने PsRun को संकलित किया है, अगर मैं इसे निर्धारित कार्य में जोड़ता हूँ, तो यह एक खिड़की को भी
चमकता है

2
यहाँ भी, यह भी काम नहीं करता है क्योंकि खिड़की अभी भी स्क्रिप्ट चलाने के लिए पॉप अप करती है। यह जल्दी से बाहर निकलता है लेकिन हम इसे बिना किसी रुकावट के पृष्ठभूमि में चलाने की कोशिश कर रहे हैं।
नाथन मैककस्ले

1
हां, यही कारण है कि "लेकिन यह प्रतिक्रिया में थोड़ी देर के लिए खिड़कियां दिखाता है"।
स्टेप

21
@ThomasBratt अनुसूचित कार्यों के लिए, मैंने पाया है कि यदि पावर "सुरक्षा विकल्प" अनुभाग के तहत सामान्य टैब पर -WindowStyle Hiddenसेट है, तो PowerShell स्क्रिप्ट चुपचाप चलती है Run whether user is logged on or not
एडम

1
सिस्टम में उपयोगकर्ता खाते का उपयोग करना भी प्रदर्शित होने वाली विंडो से बचा जाता है।
जॉन एल्ड्रिज

27

मैं एक ही मुद्दा रहा था। मुझे पता चला कि क्या आप टास्क में जाते हैं कार्य शेड्यूलर चल रहा है PowerShell.exe स्क्रिप्ट, आप क्लिक कर सकते हैं " भागो उपयोगकर्ता पर हो या ना किया गया है या नहीं " और कहा कि powershell खिड़की कभी नहीं दिखाई देगा जब काम चलाता है।


3
तीसरे पक्ष के विस्तार, निष्पादन योग्य या आवरण स्क्रिप्ट के आधार पर बिना सर्वश्रेष्ठ समाधान।
पलटना

1
ध्यान दें कि इस विकल्प के लिए उपयोगकर्ता को "लॉग ऑन बैच जॉब" का विशेषाधिकार होना चाहिए
gb96

यह समाधान मेरी स्क्रिप्ट को ठीक से नहीं चलाने के लिए बनाता है
मार्टिन अरगामी

18

आप 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/

( इस मंच सूत्र के माध्यम से ।)


क्या इसके लिए कोई NuGet paclage है ताकि मैं इसे Visual Studio से चला सकूँ?
पायोटर कुला

13

यहाँ एक दृष्टिकोण है जिसे कमांड लाइन आर्ग या अलग लांचर की आवश्यकता नहीं है। यह पूरी तरह से अदृश्य नहीं है क्योंकि एक विंडो स्टार्टअप पर पल-पल दिखाती है। लेकिन यह जल्दी से गायब हो जाता है। जहां यह ठीक है, यह है, मुझे लगता है, अगर आप अपनी स्क्रिप्ट को एक्सप्लोरर में डबल-क्लिक करके या एक स्टार्ट मेनू शॉर्टकट (सहित, बेशक स्टार्टअप सबमेनू) के माध्यम से लॉन्च करना चाहते हैं, तो सबसे आसान तरीका है। और मुझे पसंद है कि यह स्क्रिप्ट के कोड का ही हिस्सा है, न कि कुछ बाहरी।

इसे अपनी स्क्रिप्ट के सामने रखें:

$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)

10

यहाँ एक लाइनर है:

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")

हालाँकि इसके लिए यह संभव है कि बहुत संक्षेप में एक खिड़की को फ्लैश किया जाए, जो कि एक दुर्लभ घटना होनी चाहिए।


ज्यादातर मामलों में, उपयोगकर्ताओं के संदर्भ में लॉग में Powershell.exe चलाने से या तो एक पूर्ण विंडो दिखाई जाएगी या संक्षिप्त रूप से फ्लैश का उपयोग किया जाएगा, यदि आप -डॉवस्टाइल छिपी का उपयोग करते हैं। विंडो को पूरी तरह से हटाने के लिए आप दो चीजों में से एक कर सकते हैं: 1: एक अलग उपयोगकर्ता के संदर्भ में चलाएं जैसे कि व्यवस्थापक खाता (उपयोगकर्ता पर लॉग इन करने के लिए कोई विंडो प्रदर्शित नहीं करेगा)। या 2: cmd.exe / c powerhel.exe.exe -file c: \ script.ps1 लॉन्च करने के लिए एक हिडन विंडो फ्लैग के साथ objshell.run के साथ एक vbscript का उपयोग करें। जब cmd से पॉवरशेल को कॉल किया जाता है तो यह मौजूदा cmd विंडो में चलेगा जो पहले से ही wscript.exe // b / nologo c: \ launcher.vbs द्वारा छिपा हुआ है।
इकोनियू

वाह, अचानक। मैंने पहले तो आपके जवाब पर गौर भी नहीं किया। मैंने बहुत ही समान स्क्रिप्ट के साथ उत्तर दिया। एक जानकार व्यक्ति को देखना अच्छा है जो वास्तविक उत्तर देता है।
Gosha

यह स्वीकृत उत्तर होना चाहिए, यह एक ऐसा तरीका है जो हर स्थिति में काम करता है (कार्य अनुसूचक के अंदर भी, जो मेरी समस्या थी)।
मार्टिन अरगामी

6

विंडोज 7 पर, सी # से चलने पर मुझे यह समस्या हो रही थी, "इंटरएक्टिव सर्विसेज डिटेक्शन" सेवा, सिस्टम अकाउंट के रूप में एक छिपी हुई पॉवरशेल विंडो को चलाते समय पॉप अप हो रही थी।

"CreateNoWindow" पैरामीटर का उपयोग करके ISD सेवा को पॉप अप करने से रोका जाता है, यह चेतावनी है।

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};

5

मुझे लगता है कि जब आप एक पृष्ठभूमि स्क्रिप्ट चला रहे हैं तो PowerShell की कंसोल स्क्रीन को छिपाने का सबसे अच्छा तरीका यह कोड है (" ब्लूकेक्स " " उत्तर) है।

मैं अपने सभी 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

यदि यह उत्तर आपकी मदद कर रहा था, तो कृपया इस पोस्ट में उनके जवाब में "ब्लूकेक्स" को वोट करें


मेरे लिए कंसोल अभी भी लगभग एक सेकंड के लिए प्रदर्शित होता है।
thdoan

3

ps1 टास्क शेड्यूलर और शॉर्टकट से भी छिपा हुआ है

    mshta vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -ExecutionPolicy Bypass & 'C:\PATH\NAME.ps1'"", 0:close")

2

मैंने किसी भी कंसोल टूल पर कॉल पास करने के लिए एक छोटा टूल बनाया है जिसे आप मूल फ़ाइल के माध्यम से विंडोलेस शुरू करना चाहते हैं:

https://github.com/Vittel/RunHiddenConsole

संकलित करने के बाद केवल निष्पादन योग्य का नाम बदलकर "<targetExecutableName> w.exe" ("w" जोड़ें), और इसे मूल निष्पादन योग्य के बगल में रख दें। फिर आप सामान्य मापदंडों के साथ eG powershellw.exe को कॉल कर सकते हैं और यह एक विंडो को पॉप अप नहीं करेगा।

अगर किसी को यह पता है कि कैसे जांच की जाए कि बनाई गई प्रक्रिया इनपुट के लिए इंतजार कर रही है, तो अपने समाधान को शामिल करने के लिए खुश रहें :)


1
यह सबसे अच्छा उत्तर है यदि आप स्टार्टअप पर विंडो के किसी भी फ्लैश के MessageBoxबिना पॉवरशेल स्क्रिप्ट चलाना चाहते हैं (एक एक्सएक्सई की आवश्यकता है जो एक वाइनएक्स के रूप में संकलित किया गया है, कंसोल ऐप नहीं है और टास्क शेड्यूलर की आवश्यकता है, केवल तभी चलाएं जब उपयोगकर्ता लॉग हो। चालू डेस्कटॉप सत्र में "इतने संवाद दिखाते हैं।) इसे लागू करने के लिए धन्यवाद, शक्तियां। exe मेरी इच्छा सूची पर वर्षों से है!
कार्ल वॉल्श

पुनश्च: मैं थोड़ी देर पहले "इनपुट की प्रतीक्षा कर रहा है" के लिए समाधान (साथ ही साथ कुछ जोड़े बगफिक्स) को भी शामिल किया है!
क्रिस

@CarlWalsh मुझे लगता है कि इसका मतलब यह है कि इसका कंसोल ऐप नहीं है, बल्कि इसके बजाय एक जीत ऐप है, जो सही है। बस इसमें कोई विंडो शामिल नहीं है। लेकिन प्रोजेक्ट प्रकार को csproj फ़ाइल में परिभाषित किया जाना चाहिए और आपको दृश्य स्टूडियो के साथ इसे खोलने के बाद एक विशिष्ट आउटपुट प्रकार सेट करने की आवश्यकता नहीं होनी चाहिए
क्रिस

2

यहां विंडोज़ 10 में एक कार्यशील समाधान है जिसमें कोई तृतीय-पक्ष घटक शामिल नहीं है। यह VBScript में PowerShell स्क्रिप्ट को लपेटकर काम करता है।

चरण 1: हमें VBScript को PowerShell चलाने और डिफ़ॉल्ट रूप से PowerShell के साथ .ps1 फाइलें खोलने की अनुमति देने के लिए कुछ विंडोज़ सुविधाओं को बदलने की आवश्यकता है।

-भागो और "regedit" टाइप करने के लिए। Ok पर क्लिक करें और फिर इसे चलने दें।

-इस पथ को "HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell" और प्रेस दर्ज करें।

-अब दाईं ओर प्रवेश खोलें और मान को 0 में बदलें।

एक प्रशासक के रूप में पावरप्लेन को खोलें और "सेट-एक्ज़ीक्यूशनपॉलिस्पी-एक्ज़ीक्यूशनपुलिस रिमोटलीगाइड" टाइप करें, एंटर दबाएं और "वाई" के साथ बदलाव की पुष्टि करें और फिर एंटर करें।

चरण 2: अब हम अपनी स्क्रिप्ट को लपेटना शुरू कर सकते हैं।

एक .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

अपने .ps1 स्क्रिप्ट के स्थान पर फ़ाइल पथ बदलें और पाठ दस्तावेज़ को सहेजें।

-अब फाइल पर राइट क्लिक करें और नाम बदलें। फिर फ़ाइल नाम एक्सटेंशन को .vbs में बदलें और एंटर दबाएं और फिर ओके पर क्लिक करें।

किया हुआ! यदि आप अब .vbs खोलते हैं, तो आपको कोई कंसोल विंडो नहीं दिखनी चाहिए जबकि आपकी स्क्रिप्ट बैकग्राउंड में चल रही हो।

यदि यह आपके लिए काम करता है तो उत्थान सुनिश्चित करें!


1

यहां कंसोल के विभिन्न राज्यों को नियंत्रित करने का एक मजेदार डेमो है, जिसमें न्यूनतम और छिपा हुआ है।

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"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.