পাওয়ারশেল স্ক্রিপ্টে কোনও ইন্টারেক্টিভ প্রম্পটগুলি দমন করার কোনও উপায় আছে কি?


13

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

পাওয়ারশেলকে কার্যক্রমে ব্যবহারকারীর ইনপুট পাওয়ার বিপরীতে স্বয়ংক্রিয়ভাবে ব্যর্থ হওয়ার জন্য কী কোনও উপায় আছে?


আমি মনে করি আপনার প্রশ্নের নাম পরিবর্তন করা উচিত "আমি কীভাবে Remove-Itemদ্রুত ব্যর্থ হতে পারি ?"
জে বাজুজি

1
এটি বিশেষভাবে সরান-আইটেম সম্পর্কে নয়, এটি কেবল একটি উদাহরণস্বরূপ উদাহরণ। এখানে প্রচুর অন্যান্য সেমিডলেট রয়েছে যা সঠিক পরিস্থিতিতে ব্যবহারকারী ইনপুটটির জন্য অপেক্ষা করতে অবরুদ্ধ করবে।
চুউ

উত্তর:


5

এরিসের প্রস্তাবিত সমাধান কার্যকরভাবে আর একটি পাওয়ারশেলের উদাহরণ শুরু করে। সরল সিনট্যাক্স সহ এটি করার একটি বিকল্প উপায় হ'ল পাওয়ারশেল.এক্সেক্সের অন্য একটি ইভেন্টে শেল আউট করা।

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

2
সমাধানটি আমি সত্যিই পছন্দ করি তবে এটি টিআরকিউএল-তে ক্যাশ-এর ​​আগে নির্ভরযোগ্য সঞ্চিত প্রক্রিয়াগুলি লেখার দুঃস্বপ্নগুলি ফিরিয়ে আনে যা ত্রুটি সনাক্তকরণ বয়লারপ্লেট সহ আক্ষরিক অর্থে প্রতিটি প্রশ্নের প্রয়োজন হয়।
চুউ

4

দেখুন Get-Help about_Preference_Variables:

$ ConfirmPreference
------------------
    উইন্ডোজ পাওয়ারশেল আপনাকে স্বয়ংক্রিয়ভাবে অনুরোধ করবে কিনা তা নির্ধারণ করে
    একটি সেমিডলেট বা ফাংশন চালানোর আগে নিশ্চিতকরণ।

...

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

তাই:

> $ConfirmPreference = 'None'

আমি যে সমস্যাটি সেট করতে হয়েছিল তা দেখতে পেয়েছি। $ কনফার্মপ্রেফারেন্স = 'লো'
গাই টমাস

এটি কাজ করে না। ডিরেক্টরিতে সরান-আইটেমটি আপনাকে এখনও সেট করার পরে একটি প্রম্পট দেয় '' কিছুই নয় 'বা' কম 'এর কনফার্ম কনফারেন্স
চুউ

Remove-ADUser(সার্ভার 2012 আর) এর জন্য কাজ করে
ভেলকুন

2

ঠিক আছে, এটি সত্যিই কুৎসিত, তবে পবিত্র সরিষা এটি "কাজ করে"।

সমস্যা:

  • প্রথম ত্রুটির পরে কীভাবে চলতে হবে তা আমি খুঁজে পাইনি
  • এই ক্ষেত্রে এটি প্লেইন ফাইলগুলি সরিয়ে দেয়, তারপরে প্রথম ফোল্ডারে থামে
  • আমি যদি ইউটি-ট্রান্সজেকশন প্যারামিটারটি যুক্ত করি তবে এই সেমিডলেটটি কীভাবে তৈরি করা যায় তা আমি খুঁজে পাইনি
  • এটি কেবল সিম্পল কেসের জন্য কাজ করবে (যে কমান্ডগুলি বর্তমান পরিবেশের সাথে অনেক কিছু না করে)। জটিল কিছু পরীক্ষা করিনি

    $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

আমি দুটি কৌশল প্রস্তাব

ক) সংযোজন -force

খ) সংযোজন -errorAction silently continue

কোন সেমিডলেটগুলি কোনও নির্দিষ্ট প্যারামিটার সমর্থন করে তা এইভাবেই আমি গবেষণা করি

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

আমি এই পথটি শুরু করার একটি কারণ হ'ল আমি সাধারণত-ফোর্সের বিপরীতটি করতে চাই, অর্থাত্ -আলভ্যাসব্যাক অফের মতো কিছু। আমি খুঁজে পেয়েছি যে সর্বাধিক কমান্ডগুলি সমর্থন করে যা বলছে যে ব্যাক অফ করার কোনও বিকল্প নেই বলে মনে হয়।
চুউ

1
একটি সরাইয়া হিসাবে, একটি সুবিধাজনক সংক্ষেপ হিসাবে -errorAction SilentlyContinueহয় -ea 0
জে বাজুজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.