क्या पॉवरशेल स्क्रिप्ट में किसी भी इंटरैक्टिव संकेतों को दबाने का एक तरीका है?


13

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

क्या कोई ऐसा तरीका है जो PowerShell को स्वचालित रूप से विफल करने के लिए बाध्य कर सकता है क्योंकि उपयोगकर्ता इनपुट पर कार्रवाई करने की मांग कर रहा है?


मुझे लगता है कि आपको अपने प्रश्न का नाम बदलना चाहिए "मैं Remove-Itemतेजी से असफल कैसे हो सकता हूं ?"
जय बज़ुजी

1
यह विशेष रूप से निकालें-आइटम के बारे में नहीं है, यह सिर्फ एक उदाहरण है। कई अन्य cmdlets हैं जो सही परिस्थितियों में उपयोगकर्ता इनपुट के लिए प्रतीक्षा को अवरुद्ध करेंगे।
चू

जवाबों:


5

एरिस द्वारा प्रस्तावित समाधान प्रभावी रूप से एक और PowerShell उदाहरण शुरू करता है। सरल सिंटैक्स के साथ ऐसा करने का एक वैकल्पिक तरीका, शक्तियां। Exe का एक और उदाहरण है।

powershell.exe -NonInteractive -Command "Remove-Item 'D:\Temp\t'"

2
मैं वास्तव में समाधान पसंद करता हूं, लेकिन यह टीआरक्यूवाई / कैटच से पहले टीएसक्यूएल में विश्वसनीय संग्रहित प्रक्रियाओं को लिखने के बुरे सपने लाता है जिन्हें त्रुटि का पता लगाने वाले बॉयलरप्लेट के साथ शाब्दिक रूप से हर क्वेरी की आवश्यकता होती है।
चुउ

4

देखें Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    निर्धारित करता है कि क्या Windows PowerShell स्वचालित रूप से आपके लिए संकेत देता है
    cmdlet या फ़ंक्शन चलाने से पहले पुष्टि करना।

...

कोई नहीं: Windows PowerShell स्वचालित रूप से संकेत नहीं देता है।
                         किसी विशेष आदेश की पुष्टि का अनुरोध करने के लिए, का उपयोग करें
                         cmdlet या फ़ंक्शन की पुष्टि पैरामीटर।

इसलिए:

> $ConfirmPreference = 'None'

मैंने पाया कि समस्या को देखने के लिए मुझे सेट करना पड़ा। $ कन्फर्मप्रेशन = 'लो'
गाइ थॉमस

यह काम करने के लिए प्रकट नहीं होता है। एक निर्देशिका पर निकालें-आइटम अभी भी आपको 'कन्फर्म' या 'लो' के लिए $ कन्फर्मप्रेशन सेट करने के बाद एक संकेत देता है
Chuu

Remove-ADUser(सर्वर 2012 आर) के लिए काम करता है
19 को वेल्कोन

2

ठीक है, यह वास्तव में बदसूरत है, लेकिन पवित्र सरसों इसे "काम" करता है।

मुद्दे:

  • मुझे नहीं पता है कि पहली त्रुटि के बाद कैसे जारी रखा जाए
  • इस मामले में, यह सादे फ़ाइलों को हटा देता है, फिर पहले फ़ोल्डर में बंद हो जाता है
  • यदि मैंने UseTransaction पैरामीटर को जोड़ा है तो मुझे यह पता नहीं है कि इस cmdlet को कैसे बनाया जाए
  • यह केवल साधारण केस के लिए काम करेगा (ऐसे कमांड जो वर्तमान वातावरण के साथ बहुत अधिक सामान नहीं करते हैं)। मैंने कुछ भी जटिल परीक्षण नहीं किया है

    $MyPS = [Powershell]::Create()
    $MyPS.Commands.AddCommand("Remove-Item")
    $MyPS.Commands.AddParameter("Path", "D:\Temp\t")
    $MyPS.Invoke()

आउटपुट:

Commands                                                                                                                 
--------                                                                                                                 
{Remove-Item}                                                                                                            
{Remove-Item}                                                                                                            
Exception calling "Invoke" with "0" argument(s): "A command that prompts the user failed because the host program or the 
command type does not support user interaction. The host was attempting to request confirmation with the following 
message: The item at D:\Temp\t has children and the Recurse parameter was not specified. If you continue, all children 
will be removed with the item. Are you sure you want to continue?"
At line:19 char:1
+ $MyPS.Invoke()
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : CmdletInvocationException

कारण यह है कि मैंने इसे एक समाधान के रूप में चिह्नित नहीं किया है, मुझे इसका परीक्षण करने का समय नहीं मिला है। क्या लेखक के अलावा किसी ने इस कोड को तैनात या परीक्षण किया है?
चू

0

उपरोक्त सभी समाधान मेरे लिए विफल हो गए जब मैं एक निर्देशिका बना रहा था, जिसका मतलब था कि मुझे हर एक निर्देशिका को ओके करने के लिए प्रेरित किया गया था जो कि मेरी स्क्रिप्ट बनाई गई थी - जो बहुत कुछ थी। मेरे लिए जो काम करना था वह अपील की गई | आउट-नल को परिणामों को पाइप करने के लिए आउट-नल

New-Item -ItemType Directory -Path $directory -Force:$true | Out-Null

ध्यान दें कि $ निर्देशिका उस निर्देशिका के पूर्ण पथ के साथ एक स्ट्रिंग है जिसे आप बनाना चाहते हैं। आशा है कि यह किसी को कुछ समय बचाता है: पी


-1

मैं दो तकनीकों का सुझाव देता हूं

a) एपेंड करें -force

b) अपेंड करें -errorAction silently continue

यह है कि मैं कैसे अनुसंधान जो cmdlets एक विशेष पैरामीटर का समर्थन करता है

Get-Command | where { $_.parameters.keys -contains "erroraction"}

मैंने इस मार्ग को शुरू करने के कारणों में से एक यह है कि मैं आमतौर पर -फोर्स के विपरीत करना चाहता हूं, जैसे कि -लवेज़बैकऑफ़। मैंने पाया है कि समर्थन करने वाले अधिकांश कमांडों को लगता है कि उनके पास वापस जाने का कोई विकल्प नहीं है।
चू

1
एक तरफ के रूप में, के लिए एक सुविधाजनक संक्षिप्त नाम -errorAction SilentlyContinueहै -ea 0
Jay Bazuzi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.