मुखपृष्ठ » कैसे » कैसे चलाने के लिए आसान PowerShell लिपियों बनाने के लिए एक बैच फ़ाइल का उपयोग करें

    कैसे चलाने के लिए आसान PowerShell लिपियों बनाने के लिए एक बैच फ़ाइल का उपयोग करें

    कई कारणों से, अधिकतर सुरक्षा-संबंधी, पॉवरशेल स्क्रिप्ट उतनी आसानी से पोर्टेबल और प्रयोग करने योग्य नहीं होती जितनी बैच स्क्रिप्ट हो सकती है। हालाँकि, हम इन मुद्दों पर काम करने के लिए अपनी PowerShell स्क्रिप्ट के साथ एक बैच स्क्रिप्ट को बंडल कर सकते हैं। यहाँ, हम आपको उन समस्या क्षेत्रों में से कुछ दिखाएंगे, और उनके चारों ओर पाने के लिए एक बैच स्क्रिप्ट का निर्माण कैसे करें.

    मैं सिर्फ अपने .PS1 फ़ाइल को दूसरे कंप्यूटर पर कॉपी करके क्यों नहीं चला सकता?

    जब तक कि आवश्यक सिस्टम के साथ, मनमाना स्क्रिप्ट चलाने की अनुमति देने के लिए लक्ष्य प्रणाली को पूर्व-कॉन्फ़िगर नहीं किया गया है, और सही सेटिंग्स का उपयोग करते हुए, संभावना है कि जब आप ऐसा करने की कोशिश करते हैं तो आप कुछ समस्याओं में भाग लेंगे।.

    1. PowerShell डिफ़ॉल्ट रूप से .PS1 फ़ाइल एक्सटेंशन से संबद्ध नहीं है.
      हमने इसे अपनी पॉवरशेल गीक स्कूल श्रृंखला में शुरू में लाया। Windows .PS1 फ़ाइलों को PowerShell कमांड दुभाषिया के लिए भेजने के बजाय, डिफ़ॉल्ट रूप से नोटपैड को फाइल करता है। यह दुर्भावनापूर्ण लिपियों के आकस्मिक निष्पादन को केवल उन्हें डबल क्लिक करके रोकने के लिए है। ऐसे तरीके हैं जिनसे आप इस व्यवहार को बदल सकते हैं, लेकिन यह संभवत: ऐसा कुछ नहीं है जिसे आप अपने कंप्यूटर पर अपनी स्क्रिप्ट्स के चारों ओर ले जाना चाहते हैं - विशेषकर यदि उन कंप्यूटरों में से कुछ आपके खुद के नहीं हैं.
    2. PowerShell डिफ़ॉल्ट रूप से बाह्य स्क्रिप्ट निष्पादन की अनुमति नहीं देता है.
      PowerShell में ExecutionPolicy सेटिंग विंडोज के सभी संस्करणों में डिफ़ॉल्ट रूप से बाहरी स्क्रिप्ट के निष्पादन को रोकती है। कुछ विंडोज संस्करणों में, डिफ़ॉल्ट स्क्रिप्ट निष्पादन को बिल्कुल भी अनुमति नहीं देता है। हमने आपको इस सेटिंग को कैसे विंडोज 7 पर PowerShell लिपियों के निष्पादन की अनुमति देने के लिए बदलने के लिए दिखाया। हालांकि, यह भी कुछ है जो आप किसी भी कंप्यूटर पर नहीं करना चाहते हैं.
    3. कुछ PowerShell स्क्रिप्ट्स प्रशासक की अनुमति के बिना काम नहीं करेंगी.
      यहां तक ​​कि एक प्रशासक-स्तरीय खाते के साथ चलने पर, आपको अभी भी कुछ क्रियाओं को करने के लिए उपयोगकर्ता खाता नियंत्रण (UAC) के माध्यम से प्राप्त करना होगा। हम इसे अक्षम नहीं करना चाहते हैं, लेकिन यह तब भी अच्छा है जब हम इससे निपटना थोड़ा आसान बना सकते हैं.
    4. कुछ उपयोगकर्ताओं के पास पॉवरशेल वातावरण अनुकूलित हो सकता है.
      आप शायद इसमें अक्सर नहीं चलेंगे, लेकिन जब आप ऐसा करेंगे तो आपकी स्क्रिप्ट को चलाना और समस्या निवारण करना थोड़ा निराशाजनक होगा। सौभाग्य से, हम बिना किसी स्थायी परिवर्तन के भी इसे प्राप्त कर सकते हैं.

    चरण 1: चलाने के लिए डबल-क्लिक करें.

    पहली समस्या - .PS1 फ़ाइल संघों को संबोधित करके शुरू करते हैं। आप .PS1 फ़ाइलों को चलाने के लिए डबल-क्लिक नहीं कर सकते, लेकिन आप एक .BAT फ़ाइल को इस तरह निष्पादित कर सकते हैं। इसलिए, हम अपने लिए कमांड लाइन से PowerShell स्क्रिप्ट को कॉल करने के लिए एक बैच फ़ाइल लिखेंगे.

    इसलिए हमें हर स्क्रिप्ट के लिए बैच फ़ाइल को फिर से लिखना नहीं पड़ता है, या हर बार जब हम किसी स्क्रिप्ट को इधर-उधर करते हैं, तो वह PowerShell स्क्रिप्ट के लिए फ़ाइल पथ बनाने के लिए सेल्फ-रेफ़रेंसिंग चर का उपयोग करने वाला है। इस काम को करने के लिए, बैच फ़ाइल को आपके PowerShell स्क्रिप्ट के समान फ़ोल्डर में रखना होगा और उसी फ़ाइल का नाम होगा। इसलिए यदि आपकी PowerShell स्क्रिप्ट को "MyScript.ps1" कहा जाता है, तो आप अपनी बैच फ़ाइल "MyScript.bat" का नाम देना चाहते हैं और सुनिश्चित करें कि यह उसी फ़ोल्डर में है। फिर, इन पंक्तियों को बैच स्क्रिप्ट में डालें:

    @ECHO OFF PowerShell.exe -Command "और '% ~ dpn0.ps1'" PAUSE

    यदि यह जगह में अन्य सुरक्षा प्रतिबंधों के लिए नहीं थे, तो यह वास्तव में एक बैच फ़ाइल से PowerShell स्क्रिप्ट को चलाने के लिए ले जाएगा। वास्तव में, पहली और आखिरी लाइनें मुख्य रूप से केवल वरीयता का मामला है - यह दूसरी पंक्ति है जो वास्तव में काम कर रही है। यहाँ ब्रेकडाउन है:

    @ECHO रवाना गूंजती है कमांड। जब बैच फ़ाइल चलती है तो यह आपके अन्य आदेशों को ऑन-स्क्रीन दिखाने से रोकता है। यह रेखा स्वयं के सामने (@) प्रतीक के उपयोग द्वारा छिपी हुई है.

    PowerShell.exe -कमांड "और '% ~ dpn0.ps1'" वास्तव में PowerShell स्क्रिप्ट चलाता है। PowerShell.exe बेशक किसी भी CMD विंडो या बैच फ़ाइल से कहा जा सकता है कि PowerShell को हमेशा की तरह नंगे कंसोल पर लॉन्च करें। -Command पैरामीटर और उपयुक्त तर्कों को शामिल करके, आप इसे बैच फ़ाइल से सीधे कमांड चलाने के लिए भी उपयोग कर सकते हैं। जिस तरह से यह हमारे .PS1 फ़ाइल को लक्षित करने के लिए उपयोग किया जाता है वह विशेष% ~ dpn0 चर के साथ है। बैच फ़ाइल से चलाएँ,% ~ dpn0 बैच फ़ाइल के ड्राइव अक्षर, फ़ोल्डर पथ और फ़ाइल नाम (बिना एक्सटेंशन के) का मूल्यांकन करता है। चूँकि बैच फ़ाइल और PowerShell स्क्रिप्ट एक ही फ़ोल्डर में होगी और इसका नाम समान है,% ~ dpn0.ps1 PowerShell स्क्रिप्ट के पूर्ण फ़ाइल पथ में अनुवाद करेगा.

    रोकें बस बैच निष्पादन को रोक देता है और उपयोगकर्ता इनपुट की प्रतीक्षा करता है। यह आम तौर पर आपके बैच फ़ाइलों के अंत में उपयोगी होता है, ताकि आपके पास खिड़की गायब होने से पहले किसी भी कमांड आउटपुट की समीक्षा करने का मौका हो। जैसा कि हम प्रत्येक चरण के परीक्षण से गुजरते हैं, इस की उपयोगिता अधिक स्पष्ट हो जाएगी.

    इसलिए, बेसिक बैच फ़ाइल सेट की गई है। प्रदर्शन उद्देश्यों के लिए, यह फ़ाइल "D: \ Script Lab \ MyScript.bat" के रूप में सहेजी गई है और एक ही फ़ोल्डर में एक "MyScript.ps1" है। आइए देखें कि जब हम MyScript.bat पर डबल-क्लिक करते हैं तो क्या होता है.

    जाहिर है कि पॉवरशेल स्क्रिप्ट नहीं चली, लेकिन यह उम्मीद की जानी चाहिए - हमने केवल अपनी चार समस्याओं में से पहली को संबोधित किया है। हालाँकि, यहाँ कुछ महत्वपूर्ण बिट्स प्रदर्शित हैं:

    1. विंडो शीर्षक दिखाता है कि बैच स्क्रिप्ट ने सफलतापूर्वक PowerShell लॉन्च किया है.
    2. आउटपुट की पहली पंक्ति से पता चलता है कि एक कस्टम पॉवरशेल प्रोफ़ाइल उपयोग में है। यह संभावित समस्या # 4 है, जो ऊपर सूचीबद्ध है.
    3. त्रुटि संदेश प्रभाव में निष्पादन योग्य प्रतिबंधों को प्रदर्शित करता है। यही हमारी समस्या है # 2.
    4. त्रुटि संदेश का रेखांकित भाग (जो कि PowerShell के त्रुटि आउटपुट द्वारा मूल रूप से किया जाता है) दर्शाता है कि बैच स्क्रिप्ट सही तरीके से इच्छित PowerShell स्क्रिप्ट (D: \ Script Lab \ MyScript.ps1) को लक्षित कर रही है। इसलिए हम कम से कम जानते हैं कि बहुत कुछ ठीक से काम कर रहा है.

    प्रोफ़ाइल, इस मामले में, इस प्रदर्शन के लिए एक सरल एक-लाइन स्क्रिप्ट का उपयोग किया जाता है ताकि जब भी प्रोफ़ाइल सक्रिय हो, आउटपुट उत्पन्न कर सके। ऐसा करने के लिए आप अपनी खुद की PowerShell प्रोफ़ाइल को भी कस्टमाइज़ कर सकते हैं, यदि आप इन लिपियों का परीक्षण स्वयं करना चाहते हैं। बस अपनी प्रोफ़ाइल स्क्रिप्ट में निम्न पंक्ति जोड़ें:

    राइट-आउटपुट 'प्रभाव में कस्टम पॉवरशेल प्रोफाइल!'

    यहाँ परीक्षण प्रणाली पर ExecutionPolicy RemoteSign पर सेट है। यह स्थानीय रूप से बनाई गई स्क्रिप्ट के निष्पादन की अनुमति देता है (प्रोफाइल स्क्रिप्ट की तरह), जब तक कि वे किसी विश्वसनीय प्राधिकारी द्वारा हस्ताक्षरित न हों, बाहरी स्रोतों से स्क्रिप्ट को ब्लॉक करना। प्रदर्शन प्रयोजनों के लिए, निम्न कमांड का उपयोग MyScript.ps1 को बाहरी स्रोत से होने के रूप में फ़्लैग करने के लिए किया गया था:

    Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Value "[ZoneTransfer] 'nZoneId = 3" -Stream' Zone.Identifier '

    यह MyScript.ps1 पर Zone.Identifier वैकल्पिक डेटा स्ट्रीम सेट करता है ताकि Windows को लगे कि फाइल इंटरनेट से आई है। इसे निम्न आदेश के साथ आसानी से बदला जा सकता है:

    क्लियर-कंटेंट -पैथ 'डी: \ स्क्रिप्ट लैब \ MyScript.ps1' -Stream 'Zone.Identifier'

    चरण 2: ExecutionPolicy के आसपास हो रही है.

    CMD या बैच स्क्रिप्ट से ExecutionPolicy सेटिंग के आसपास प्राप्त करना, वास्तव में बहुत आसान है। हम अभी PowerShell.exe कमांड में एक और पैरामीटर जोड़ने के लिए स्क्रिप्ट की दूसरी पंक्ति को संशोधित करते हैं.

    PowerShell.exe -ExecutionPolicy Bypass -Command "और '% ~ dpn0.p1"

    -ExecutionPolicy पैरामीटर को ExecutionPolicy को संशोधित करने के लिए उपयोग किया जा सकता है जब आप एक नया PowerShell सत्र स्पॉन करते हैं। यह उस सत्र से परे नहीं रहेगा, इसलिए जब भी हमें सिस्टम की सामान्य सुरक्षा मुद्रा को कमजोर किए बिना पावरस्ले को इस तरह से चलाया जा सकता है। अब जबकि हमने तय कर लिया है कि चलो, एक और चलें:

    अब जब स्क्रिप्ट को ठीक से निष्पादित किया गया है, तो हम देख सकते हैं कि यह वास्तव में क्या करता है। यह हमें बता रहा है कि हम लिपि को सीमित उपयोगकर्ता के रूप में चला रहे हैं। स्क्रिप्ट वास्तव में प्रशासक की अनुमति के साथ एक खाते द्वारा चलाया जा रहा है, लेकिन उपयोगकर्ता खाता नियंत्रण रास्ते में हो रहा है। हालांकि प्रशासक पहुंच के लिए स्क्रिप्ट की जांच कैसे कर रहे हैं, इसका विवरण इस लेख के दायरे से परे है, यहां वह कोड है जो प्रदर्शन के लिए उपयोग किया जा रहा है:

    if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ())। IsInRole ([Security.Principal.WindowsBuiltInRole "" Administrator ")) Write-Output’ को प्रशासक के रूप में चल रहा है! ” और! लिखें-आउटपुट ’रनिंग लिमिटेड!’ ठहराव

    आप यह भी देखेंगे कि स्क्रिप्ट आउटपुट में अब दो "पॉज़" ऑपरेशन हैं - एक PowerShell स्क्रिप्ट से, और एक बैच फ़ाइल से। इसका कारण अगले चरण में अधिक स्पष्ट होगा.

    चरण 3: व्यवस्थापक पहुंच प्राप्त करना.

    यदि आपकी स्क्रिप्ट में ऐसी कोई भी कमांड नहीं चलती है, जिसे ऊंचाई की आवश्यकता होती है, और आपको पूरा यकीन है कि आपको रास्ते में किसी के भी कस्टम प्रोफाइल के बारे में चिंता करने की ज़रूरत नहीं होगी, तो आप इसे छोड़ सकते हैं। यदि आप कुछ प्रशासक स्तर के cmdlets चला रहे हैं, तो आपको इस टुकड़े की आवश्यकता होगी.

    दुर्भाग्य से, बैच फ़ाइल या सीएमडी सत्र के भीतर से ऊंचाई के लिए यूएसी को ट्रिगर करने का कोई तरीका नहीं है। हालाँकि, PowerShell हमें Start-Process के साथ ऐसा करने की अनुमति देता है। जब अपने तर्क में "-Verb RunAs" के साथ प्रयोग किया जाता है, तो स्टार्ट-प्रोसेस प्रशासक की अनुमति से एक एप्लिकेशन लॉन्च करने का प्रयास करेगा। यदि PowerShell सत्र पहले से ऊंचा नहीं है, तो यह UAC प्रॉम्प्ट को ट्रिगर करेगा। अपनी स्क्रिप्ट लॉन्च करने के लिए बैच फ़ाइल से इसका उपयोग करने के लिए, हम स्क्रिप्ट को चलाने के लिए, स्टार्ट-प्रोसेस को फायर करने के लिए दो पावरशेल प्रक्रियाएँ शुरू करेंगे - एक स्टार्ट-प्रोसेस और दूसरा फायर। बैच फ़ाइल की दूसरी पंक्ति को इसे बदलने की आवश्यकता है:

    PowerShell.exe -Command "और Start-Process PowerShell.exe -rgumentList '-ExecutionPolicy Bypass -File" "% ~ dpn0.ps1" "' -Verent RunAs"

    जब बैच फ़ाइल चलाई जाती है, तो आउटपुट की पहली पंक्ति जो हम देखेंगे वह PowerShell प्रोफ़ाइल स्क्रिप्ट से होती है। तब, एक UAC प्रॉम्प्ट होगा जब Start-Process MyScript.ps1 को लॉन्च करने की कोशिश करता है.

    UAC प्रॉम्प्ट पर क्लिक करने के बाद, एक नया PowerShell उदाहरण स्पॉन करेगा। क्योंकि यह एक नया उदाहरण है, निश्चित रूप से, हम फिर से प्रोफाइल स्क्रिप्ट नोटिस देखेंगे। फिर, MyScript.ps1 चलता है और हम देखते हैं कि हम वास्तव में एक ऊंचे सत्र में हैं.

    और इसका कारण यह है कि हमारे यहां दो ठहराव हैं। यदि PowerShell स्क्रिप्ट में से किसी एक के लिए नहीं है, तो हम स्क्रिप्ट के आउटपुट को कभी नहीं देख पाएंगे - जैसे ही स्क्रिप्ट चल रही है PowerShell विंडो पॉप अप और गायब हो जाएगी। और बैच फ़ाइल में विराम के बिना, हम यह देखने में सक्षम नहीं होंगे कि पहली बार में PowerShell को लॉन्च करने में कोई त्रुटि थी या नहीं.

    चरण 4: कस्टम PowerShell प्रोफाइल के आसपास हो रही है.

    आइए अब हम उस खराब कस्टम प्रोफाइल नोटिस से छुटकारा पा लेंगे, यहां, यह शायद ही एक उपद्रव है, लेकिन अगर उपयोगकर्ता का पावरशेल प्रोफाइल डिफ़ॉल्ट सेटिंग्स, चर, या फ़ंक्शन को उन तरीकों से बदलता है, जिनकी आपने अपनी स्क्रिप्ट के साथ अनुमान नहीं लगाया है, तो वे वास्तव में परेशानी हो सकती हैं। प्रोफाइल के बिना अपनी स्क्रिप्ट को चलाना पूरी तरह से सरल है, इसलिए आपको इस बारे में चिंता करने की आवश्यकता नहीं है। ऐसा करने के लिए, हमें बस बैच फ़ाइल की दूसरी पंक्ति को एक बार बदलने की आवश्यकता है:

    PowerShell.exe -NoProfile -Command "और Start-Process PowerShell.exe -rgumentList '-NoProfile -ExecutionPolicy Bypass -File" "% ~ dpb0.ps1" "" -Verb RunAs "

    स्क्रिप्ट द्वारा लॉन्च किए गए PowerShell के दोनों उदाहरणों में -NoProfile पैरामीटर को जोड़ने का अर्थ है कि उपयोगकर्ता की प्रोफ़ाइल स्क्रिप्ट पूरी तरह से दोनों चरणों में बायपास हो जाएगी और हमारी PowerShell स्क्रिप्ट काफी अनुमानित, डिफ़ॉल्ट वातावरण में चलेगी। यहाँ, आप देख सकते हैं कि किसी भी शंख में कोई कस्टम प्रोफाइल नोटिस नहीं है.

    यदि आपको अपने PowerShell स्क्रिप्ट में व्यवस्थापक अधिकारों की आवश्यकता नहीं है, और आपने चरण 3 को छोड़ दिया है, तो आप दूसरी PowerShell उदाहरण के बिना कर सकते हैं और आपकी बैच फ़ाइल की दूसरी पंक्ति इस तरह दिखनी चाहिए:

    PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "और '% ~ dpn0.ps1'"

    आउटपुट तब इस तरह दिखेगा:

    (बेशक, गैर-प्रशासक स्क्रिप्ट के लिए, आप अपने PowerShell स्क्रिप्ट में एंड-ऑफ़-स्क्रिप्ट स्क्रिप्ट के बिना भी कर सकते हैं, क्योंकि सब कुछ एक ही कंसोल विंडो में कैप्चर किया गया है और अंत के ठहराव से वहां आयोजित किया जाएगा) बैच फ़ाइल वैसे भी।)

    बैच फ़ाइलों को पूरा किया.

    इस पर निर्भर करता है कि आपको अपनी PowerShell स्क्रिप्ट के लिए प्रशासक की अनुमति की आवश्यकता है या नहीं (और यदि आप नहीं चाहते हैं तो आपको वास्तव में उनसे अनुरोध करना चाहिए) अंतिम बैच फ़ाइल को नीचे दिए गए दो में से एक जैसा दिखना चाहिए.

    व्यवस्थापक पहुँच के बिना:

    @ECHO OFF PowerShell.exe -NoProfile -ExecutionPolicy Bypass -Command "और '% ~ dpn0.ps1'" PAUSE

    व्यवस्थापक पहुँच के साथ:

    @ECHO OFF PowerShell.exe -NoProfile -Command "और Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File"% ~ dpn0.ps1 "" "-Verb RunAs

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


    संदर्भ:

    • एक बैच फ़ाइल से PowerShell स्क्रिप्ट चलाना - डैनियल श्रोएडर के प्रोग्रामिंग ब्लॉग
    • PowerShell में व्यवस्थापक अनुमतियों के लिए जाँच - अरे, स्क्रिप्टिंग गाइ! ब्लॉग