উইন্ডো প্রদর্শিত না করে পাওয়ারশেল স্ক্রিপ্টটি কীভাবে চালানো যায়?


127

উইন্ডো বা অন্য কোনও চিহ্ন ব্যবহারকারীর কাছে প্রদর্শন না করে পাওয়ারশেল স্ক্রিপ্টটি চালানো কীভাবে সম্ভব ?

অন্য কথায়, স্ক্রিপ্টটি ব্যবহারকারীর কাছে কোনও চিহ্ন ছাড়াই ব্যাকগ্রাউন্ডে চুপচাপ চালানো উচিত।

কোনও উত্তরের জন্য অতিরিক্ত useণ যা তৃতীয় পক্ষের উপাদানগুলি ব্যবহার করে না :)


আপনি যদি শিখতে আগ্রহী হন তবে এই প্রশ্নটি দেখুন: স্ট্যাকওভারফ্লো
টমাস ব্র্যাট

এই সমাধান হিসেবে ভাল কার্য পরিকল্পনাকারী জন্য কাজ করে stackoverflow.com/a/51007810/571591
Hilydrow

উত্তর:


128

আপনি হয় এটির মতো চালাতে পারেন (তবে এটি কিছুক্ষণের জন্য উইন্ডো দেখায়):

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

অথবা আপনি PsRun.exe নামক উইন্ডোটি এড়াতে আমার তৈরি একটি সহায়ক ফাইল ব্যবহার করেন যা ঠিক এটি করে। আপনি উত্স এবং এক্সি ফাইল ডাউনলোড করতে পারেন পাওয়ারশেলের উইনফর্ম জিইআইয়ের সাথে নির্ধারিত কাজগুলি চালিয়ে যান । আমি এটি নির্ধারিত কাজের জন্য ব্যবহার করি।

সম্পাদিত: যেমনটি মার্কো উল্লেখ করেছেন যে এই উইন্ডোস্টাইল প্যারামিটারটি কেবল ভি 2 এর জন্য উপলব্ধ।


6
আমি পিএসআরনটি সংকলন করেছি, তবে, আমি যদি এটি নির্ধারিত টাস্কটিতে যুক্ত করি তবে এটি একটি উইন্ডোও জ্বলজ্বল করে ...
সিয়েন্টিক

2
এখানেও একইভাবে কাজ করে না কারণ স্ক্রিপ্টটি চালানোর জন্য উইন্ডোটি এখনও পপ আপ করে। এটি দ্রুত প্রস্থান করে তবে আমরা এটিকে ব্যত্যয় ছাড়াই ব্যাকগ্রাউন্ডে চালানোর চেষ্টা করছি।
নাথান ম্যাকক্যাস্কেল

1
হ্যাঁ, সে কারণেই প্রতিক্রিয়াটিতে "তবে এটি কিছুক্ষণের জন্য একটি উইন্ডো দেখায়"।
stej

21
@ থমাসব্র্যাট নির্ধারিত কাজগুলির জন্য, আমি পেয়েছি পাওয়ারশেল স্ক্রিপ্টগুলি "সুরক্ষা বিকল্পগুলি" বিভাগের অধীন জেনারেল ট্যাবে -WindowStyle Hiddenসেট করা না থাকলে নিঃশব্দে চলবে Run whether user is logged on or not
আদম

1
SYSTEM- তে ব্যবহারকারী অ্যাকাউন্ট ব্যবহার করা উইন্ডো প্রদর্শিত হওয়া এড়িয়ে যায়।
জন এল্ড্রিজে

27

আমি এই একই সমস্যা ছিল। আমি বুঝতে পারলাম যদি আপনি যেতে টাস্ক মধ্যে কার্য পরিকল্পনাকারী চলমান যে powershell.exe স্ক্রিপ্ট, আপনি ক্লিক করতে পারেন " চালান ব্যবহারকারী বা না লগ করা হয় কিনা " এবং যে PowerShell জানালা কখনও দেখাবেন যখন টাস্ক রান।


3
তৃতীয় পক্ষের এক্সটেনশন, এক্সিকিউটেবল বা র‌্যাপার স্ক্রিপ্টের উপর নির্ভর করে সেরা সমাধান।
বিপরীতমুখী

1
নোট করুন যে এই বিকল্পটির ব্যবহারকারীর "ব্যাচ জব হিসাবে লগ ইন করুন" সুবিধা থাকা দরকার
gb96

এই সমাধানটি আমার স্ক্রিপ্টটি সঠিকভাবে না চালিত করে
মার্টিন আরজারামি

18

আপনি পাওয়ারশেল সম্প্রদায় এক্সটেনশনগুলি ব্যবহার করতে পারেন এবং এটি করতে পারেন :

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden

আপনি এটি ভিবিএস স্ক্রিপ্টের সাহায্যেও করতে পারেন: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-schedised-powershell/

( এই ফোরাম থ্রেড মাধ্যমে ।)


এর জন্য কি কোনও নিউগেট প্যাকেজ রয়েছে যাতে আমি এটি ভিজ্যুয়াল স্টুডিও থেকে চালাতে পারি?
পাইওটর কুলা

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

যদিও এটির পক্ষে খুব সম্ভবত সংক্ষেপে একটি উইন্ডো ফ্ল্যাশ করা সম্ভব, এটি বিরল ঘটনা হওয়া উচিত।


বেশিরভাগ ক্ষেত্রে, লগ-ইন থাকা ব্যবহারকারীদের প্রসঙ্গে Powerersll.exe চালানো সম্পূর্ণ উইন্ডো প্রদর্শন করবে বা সংক্ষেপে ফ্ল্যাশ করবে যদি আপনি উইন্ডোস্টাইল লুকানো ব্যবহার করেন। উইন্ডোটিকে পুরোপুরি অপসারণ করতে আপনি দুটি কাজের মধ্যে একটি করতে পারেন: ১: অ্যাডমিন অ্যাকাউন্টের মতো কোনও পৃথক ব্যবহারকারীর প্রসঙ্গে চালান (লগ-ইন থাকা ব্যবহারকারীর জন্য কোনও উইন্ডো প্রদর্শিত হবে না)। বা 2: cmd.exe / c পাওয়ারশেল.এক্সে-ফাইল ফাইল সি: \ স্ক্রিপ্ট.পিএস 1 চালু করতে একটি লুকানো উইন্ডো ফ্ল্যাগ সহ অবজেক্টেল.রুনের সাথে একটি ভিজস্ক্রিপ্ট ব্যবহার করুন। যখন পাওয়ারশেলটি সেন্টিমিডি থেকে কল করা হবে এটি বিদ্যমান সেমিডি উইন্ডোতে চলবে যা ইতিমধ্যে wscript.exe // b / nologo c: \ লঞ্চার.ভিবিএস দ্বারা লুকানো রয়েছে।
আইকনিউ

বাহ, হঠাৎ আপনার উত্তরটি আমি প্রথমে খেয়ালও করি নি। আমি খুব অনুরূপ স্ক্রিপ্ট দিয়ে উত্তর দিয়েছি। সত্যিকারের উত্তর দেয় এমন কোনও জ্ঞানী ব্যক্তি দেখে ভাল লাগল।
গোশা

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, এটি এক পদ্ধতি যা প্রতিটি পরিস্থিতিতে কাজ করে বলে মনে হয় (টাস্ক শিডিয়ুলারের অভ্যন্তরে যা আমার সমস্যা ছিল)।
মার্টিন আরজারামি

6

উইন্ডোজ on-তে সি # থেকে চলাকালীন আমার এই সমস্যাটি ছিল, যখন সিস্টেমে অ্যাকাউন্ট হিসাবে একটি লুকানো পাওয়ারশেল উইন্ডো চালানোর সময় "ইন্টারেক্টিভ পরিষেবাদি সনাক্তকরণ" পরিষেবাটি পপিং করছিল।

"ক্রিয়েটনো উইন্ডো" প্যারামিটার ব্যবহার করে আইএসডি পরিষেবাটি পপিংয়ের বিষয়টি সতর্ক করে দিয়েছে।

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

5

আমি মনে করি যে আপনি যখন ব্যাকগ্রাউন্ড স্ক্রিপ্টগুলি চালাচ্ছেন তখন পাওয়ারশেলের কনসোল স্ক্রিনটি লুকানোর সর্বোত্তম উপায় হ'ল এই কোড (" ব্লুেকেকস " উত্তর)।

আমি আমার সমস্ত পাওয়ারশেল স্ক্রিপ্টগুলির শুরুতে এই কোডটি যুক্ত করি যা আমার পটভূমিতে চালানো দরকার।

# .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

যদি এই উত্তরটি আপনাকে সহায়তা করে থাকে তবে দয়া করে এই পোস্টে তার উত্তরটিতে "ব্লুেকেকস "কে ভোট দিন


আমার জন্য কনসোলটি এখনও প্রায় এক সেকেন্ডের জন্য প্রদর্শন করে।
thdan

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" (একটি "ডাব্লু") যুক্ত করুন এবং এটিকে মূল এক্সিকিউটেবলের পাশে রাখুন। এরপরে আপনি সাধারণ পরামিতিগুলির সাথে ইজি পাওয়ারসেলও.এক্সএকে কল করতে পারেন এবং এটি কোনও উইন্ডো পপ আপ করবে না।

কারও যদি ধারণা থাকে যে কীভাবে তৈরি করা প্রক্রিয়া ইনপুটটির জন্য অপেক্ষা করছে কিনা তা পরীক্ষা করে দেখুন, অসুস্থ আপনার সমাধান অন্তর্ভুক্ত করে খুশি হন :)


1
এটি যদি আপনি প্রারম্ভকালে উইন্ডোর কোনও ফ্ল্যাশ MessageBoxছাড়াই পাওয়ারশেল স্ক্রিপ্টগুলি চালনা করতে চান তবে (কোনও কনসোল অ্যাপ্লিকেশন নয়, ওয়াইনक्सी হিসাবে সংকলিত একটি এক্সইইএস প্রয়োজন, এবং ব্যবহারকারী লগ-ইন করার সময় কেবলমাত্র চালানোতে সেট করতে টাস্ক শিডিয়ুলার প্রয়োজন অন ​​"তাই ডায়ালগগুলি বর্তমান ডেস্কটপ সেশনে দেখায়)) এটি বাস্তবায়নের জন্য ধন্যবাদ, পাওয়ারশেলড.এক্সই আমার ইচ্ছার তালিকায় বছরের পর বছর ধরে রয়েছে!
কার্ল ওয়ালশ

পিএস: আমি কিছুক্ষণ আগে "ইনপুটটির জন্য অপেক্ষা করার" জন্য সমাধানটি অন্তর্ভুক্ত করেছি (পাশাপাশি কয়েক জোড়া বাগফিক্সও)!
ক্রিস

@ কার্লওয়ালশ আমি ধরে নিয়েছি আপনার অর্থ হ'ল এটি কোনও কনসোল অ্যাপ নয়, বরং এর পরিবর্তে একটি জয় অ্যাপ্লিকেশন তৈরি করে, যা সঠিক। এটি কোনও উইন্ডো অন্তর্ভুক্ত করে না। তবে প্রকল্পের ধরণটি সিএসপোজ ফাইলটিতে সংজ্ঞায়িত করা উচিত এবং ভিজ্যুয়াল স্টুডিওতে এটি খোলার পরে আপনাকে একটি নির্দিষ্ট আউটপুট টাইপ সেট করার দরকার নেই
ক্রিস

2

এখানে উইন্ডোজ 10 এর একটি কার্যক্ষম সমাধান যা কোনও তৃতীয় পক্ষের উপাদানগুলিকে অন্তর্ভুক্ত করে না। এটি পাওয়ারশেল স্ক্রিপ্টটিকে ভিবিএস স্ক্রিপ্টে মোড়ানো দ্বারা কাজ করে।

পদক্ষেপ 1: আমাদের ভিবিএস স্ক্রিপ্টটিকে পাওয়ারশেল চালিত করার অনুমতি দিতে এবং ডিফল্টরূপে পাওয়ারশেলের সাহায্যে .ps1 ফাইলগুলি খোলার জন্য কিছু উইন্ডো বৈশিষ্ট্য পরিবর্তন করতে হবে।

- চালাতে যান এবং "regedit" টাইপ করুন। ওকে ক্লিক করুন এবং তারপরে এটি চালানোর অনুমতি দিন।

"HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1" শেল "এই পাথটি আটকে দিন এবং এন্টার টিপুন।

- এখন ডানদিকে এন্ট্রি খুলুন এবং মানটি 0 তে পরিবর্তন করুন।

প্রশাসক হিসাবে পাওয়ারশেল খুলুন এবং "সেট-এক্সিকিউশনপলিসি-এক্সিকিউশনপলিসি রিমোটসাইনড" টাইপ করুন, এন্টার টিপুন এবং "y" দিয়ে পরিবর্তনটি নিশ্চিত করুন এবং তারপরে এন্টার দিন।

পদক্ষেপ 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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.