बैच फ़ाइल से PowerShell स्क्रिप्ट कैसे चलाएं


197

मैं इस स्क्रिप्ट को PowerShell में चलाने का प्रयास कर रहा हूं। मैंने नीचे दी गई स्क्रिप्ट को ps.ps1अपने डेस्कटॉप पर सहेज लिया है ।

$query = "SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"
Register-WMIEvent -Query $query -Action { invoke-item "C:\Program Files\abc.exe"}

मैंने इस PowerShell स्क्रिप्ट को चलाने के लिए एक बैच स्क्रिप्ट बनाई है

@echo off
Powershell.exe set-executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1
pause

लेकिन मुझे यह त्रुटि मिल रही है:

यहां छवि विवरण दर्ज करें

जवाबों:


267

आपको -ExecutionPolicyपैरामीटर की आवश्यकता है :

Powershell.exe -executionpolicy remotesigned -File  C:\Users\SE\Desktop\ps.ps1

अन्यथा PowerShell तर्क निष्पादित करने के लिए एक लाइन पर विचार करता है और जब तक Set-ExecutionPolicy है एक cmdlet, यह कोई नहीं है -Fileपैरामीटर।


2
@joey ने धन्यवाद काम किया..लेकिन बैट फाइल चलाने के बाद मुझे यह त्रुटि मिली "वारिंग: कॉलम 'कमांड' डिस्प्ले में फिट नहीं होता है और इसे हटा दिया गया"
Eka

यह एक चेतावनी है, एक त्रुटि नहीं है। और एक विषय के एक और प्रश्न के लिए।
जॉय

@joey क्या स्टैक में एक और सवाल लिखना बुद्धिमानी है। इस छोटी सी चेतावनी के लिए?
Eka

2
@Joey Haha, तो प्रभावी रूप से आप एक व्यवस्थापक हुए बिना इस नीति को ओवरराइड कर सकते हैं। यह एक सुरक्षा मुद्दा है?
कोलोब कैन्यन

2
@KolobCanyon: यदि आप ऐसी स्थिति में हैं जहाँ आप PowerShell चला सकते हैं, तो आप और भी बहुत कुछ कर सकते हैं। ध्यान दें कि निष्पादन नीति का मतलब यह नहीं है कि पावरशेल में विशेषाधिकारों की तुलना में अधिक है। एक तरह से यह केवल आकस्मिक रूप से चलने वाली चीजों से बचने के लिए एक सुविधा है जिसे आप चलाना नहीं चाहते हैं। ./यूनिक्स पर एक निष्पादन योग्य ध्वज के साथ वर्तमान निर्देशिका में उपसर्ग कमांड रखने के समान है ।
जॉय

117

मैं दोनों को समझाता हूं कि आप बैच फ़ाइल से पॉवरशेल स्क्रिप्ट क्यों कॉल करना चाहते हैं और इसे अपने ब्लॉग पोस्ट में यहां कैसे करें

यह मूल रूप से आप क्या देख रहे हैं:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\SE\Desktop\ps.ps1'"

और यदि आपको एक व्यवस्थापक के रूप में अपनी PowerShell स्क्रिप्ट चलाने की आवश्यकता है, तो इसका उपयोग करें:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Users\SE\Desktop\ps.ps1""' -Verb RunAs}"

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


जब मैं cmd ​​विंडो में कमांड लाइन टाइप करता हूं, तो Invoke-WebRequest ठीक काम कर रहा होता है, लेकिन जब भी मैं इसे बैच फाइल से चलाता हूं तो 404 देता है। मैं कोशिश कर रहा हूँ PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass Invoke-WebRequest https://www.example.com/example.ics -OutFile C:\_my\script.ics' -Verb RunAs}";या powershell -Command "Invoke-WebRequest https://www.example.com/example.ics -OutFile c:\_my\file.ics"एक .ps1 फ़ाइल में एक ही विकल्प का उपयोग कर रहा हूँ , या (New-Object Net.WebClient).DownloadFile। कोई विचार?
क्रिस

का उपयोग करने का प्रयास करें-निष्पादनपुलिस अप्रतिबंधित। मैं अनुमान लगा रहा हूं कि बाईपास विकल्प पॉवरशेल नेटवर्क एक्सेस नहीं देता है।
डेडलीडॉग

1
@ बेलन संदर्भित ब्लॉग पोस्ट से पता चलता है कि स्क्रिप्ट को कैसे मापदंडों को पारित करना है।
घातक

19

यदि आप पूरी तरह से योग्य पथ के बिना वर्तमान निर्देशिका से चलाना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& './ps.ps1'"

16

यदि आप PowerShell को एक व्यवस्थापक के रूप में बुलाते हुए एक बैच फ़ाइल चलाते हैं, तो आप बेहतर तरीके से इसे चलाते हैं, जिससे आप सभी परेशानियों से बच जाते हैं:

powershell.exe -ExecutionPolicy Bypass -Command "Path\xxx.ps1"

यह उपयोग करने के लिए बेहतर है Bypass...


3

यदि आप कुछ स्क्रिप्ट चलाना चाहते हैं, तो आप उपयोग कर सकते हैं Set-executionpolicy -ExecutionPolicy Unrestrictedऔर फिर से रीसेट कर सकते हैं Set-executionpolicy -ExecutionPolicy Default

ध्यान दें कि निष्पादन नीति की जाँच तभी की जाती है जब आप इसका निष्पादन शुरू करते हैं (या ऐसा लगता है) और इसलिए आप पृष्ठभूमि में नौकरी चला सकते हैं और निष्पादन नीति को तुरंत रीसेट कर सकते हैं।

# Check current setting
Get-ExecutionPolicy

# Disable policy
Set-ExecutionPolicy -ExecutionPolicy Unrestricted
# Choose [Y]es

Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 example.com | tee ping__example.com.txt }
Start-Job { cd c:\working\directory\with\script\ ; ./ping_batch.ps1 google.com  | tee ping__google.com.txt  }

# Can be run immediately
Set-ExecutionPolicy -ExecutionPolicy Default
# [Y]es

2

बैच से पीएस स्क्रिप्ट को निष्पादित करने का एक और आसान तरीका यह है कि इसे ECHO और पुनर्निर्देशन वर्णों के बीच शामिल किया जाए, (> और >>), उदाहरण:

@echo off
set WD=%~dp0
ECHO New-Item -Path . -Name "Test.txt" -ItemType "file" -Value "This is a text string." -Force > "%WD%PSHELLFILE.ps1"
ECHO add-content -path "./Test.txt" -value "`r`nThe End" >> "%WD%PSHELLFILE.ps1"
powershell.exe -ExecutionPolicy Bypass -File "%WD%PSHELLFILE.ps1"
del "%WD%PSHELLFILE.ps1"

अंतिम पंक्ति बनाई गई अस्थायी फ़ाइल को हटा देती है।


1

यदि आपकी PowerShell लॉगिन स्क्रिप्ट 2012 के सर्वर पर 5 मिनट (जैसा मेरा था) के बाद चल रही है, तो सर्वर पर GPO सेटिंग है - 'लॉगिन स्क्रिप्ट को कॉन्फ़िगर करें विलंब' डिफ़ॉल्ट सेटिंग 'कॉन्फ़िगर नहीं है' यह 5 मिनट की देरी को छोड़ देगा। लॉगिन स्क्रिप्ट चलाने से पहले।


1

छोटा सा नमूना परीक्षण। cmd

<# :
  @echo off
    powershell /nologo /noprofile /command ^
         "&{[ScriptBlock]::Create((cat """%~f0""") -join [Char[]]10).Invoke(@(&{$args}%*))}"
  exit /b
#>
Write-Host Hello, $args[0] -fo Green
#You programm...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.