কিভাবে একটি ব্যাচ ফাইল থেকে পাওয়ারশেল স্ক্রিপ্ট চালানো যায়


197

আমি পাওয়ারশিলে এই স্ক্রিপ্টটি চালানোর চেষ্টা করছি। আমি ps.ps1আমার ডেস্কটপে যেমন নীচের স্ক্রিপ্টটি সংরক্ষণ করেছি।

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

এই পাওয়ারশেল স্ক্রিপ্টটি চালানোর জন্য আমি একটি ব্যাচের স্ক্রিপ্ট তৈরি করেছি

@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
@ জোয়াই এটি ধন্যবাদ কাজ করেছে..কিন্তু ব্যাট ফাইল চালানোর পরে আমি এই ত্রুটি পেয়েছি "সতর্কতা: কলাম 'কমান্ড' ডিসপ্লেতে ফিট করে না এবং সরানো হয়েছিল"
একা

এটি একটি সতর্কতা, ত্রুটি নয়। এবং আরও একটি প্রশ্নের জন্য একটি বিষয়।
জোয়

@ জোয়ি স্ট্যাকের মধ্যে আরও একটি প্রশ্ন লেখার পক্ষে কি বুদ্ধিমানের কাজ? এসই এই ছোট্ট সতর্কতার জন্য?
একা

2
@ জোয়ে হা, এত কার্যকরভাবে আপনি প্রশাসক না হয়ে এই নীতিটিকে ওভাররাইড করতে পারেন। এটি কি সুরক্ষার সমস্যা?
কলব ক্যানিয়ন

2
@ কলবক্যানিয়ন: আপনি যদি এমন একটি অবস্থানে থাকেন যেখানে আপনি পাওয়ারশেল চালাতে পারেন তবে আপনি আরও কিছু করতে পারবেন। দ্রষ্টব্য যে এক্সিকিউশন পলিসিটির অর্থ এই নয় যে পাওয়ারশেলের অন্যরকম সুবিধাগুলি রয়েছে। একরকম দুর্ঘটনাক্রমে চালানো জিনিসগুলি আপনি চালাতে না চান তা এড়াতে এটি কেবল একটি সুবিধা। ./ইউনিক্সের সাথে এক্সিকিউটিউটেবল পতাকা সহ বর্তমান ডিরেক্টরিতে প্রিফিক্স কমান্ড থাকার অনুরূপ ।
জোয়

117

আপনি কেন একটি ব্যাচ ফাইল থেকে পাওয়ারশেল স্ক্রিপ্ট কল করতে চান এবং এখানে আমার ব্লগ পোস্টে এটি কীভাবে করবেন তা উভয়কেই আমি ব্যাখ্যা করি ।

এটিই মূলত আপনি যা খুঁজছেন তা:

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

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

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

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


আমি যখন কোনও সেমিড উইন্ডোতে কমান্ড লাইনটি টাইপ করি তবে ইনভোক-ওয়েবরয়েভেস্ট ঠিকঠাক কাজ করে, তবে যখনই আমি ব্যাচ ফাইলের মধ্যে থেকে এটি চালাই তখনই 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। কোন ধারনা?
ক্রিস

এক্সেক্সিউশনপলিসি অবিরত না করে ব্যবহার করার চেষ্টা করুন। আমি অনুমান করছি যে বাইপাস বিকল্পটি পাওয়ারশেল নেটওয়ার্ক অ্যাক্সেস দেয় না।
মারাত্মক ডগ 21

1
@ বেলুন রেফারেন্সযুক্ত ব্লগ পোস্টটি স্ক্রিপ্টে প্যারামিটারগুলি কীভাবে পাস করবেন তা দেখায়।
মারাত্মক ডগ

19

আপনি যদি পুরোপুরি যোগ্যতাসম্পন্ন পাথ ছাড়াই বর্তমান ডিরেক্টরি থেকে চালাতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

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

16

আপনি যদি প্রশাসক হিসাবে পাওয়ারশেলকে কল করে একটি ব্যাচ ফাইল চালনা করেন তবে আপনি সমস্ত সমস্যা বাঁচিয়ে আরও ভালভাবে চালান:

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

যদি আপনার পাওয়ারশেল লগইন স্ক্রিপ্টটি একটি 2012 সার্ভারে 5 মিনিটের পরে (যেমন ছিল আমার যেমন ছিল) চলতে থাকে তবে একটি সার্ভারে একটি জিপিও সেটিং রয়েছে - 'লগইন স্ক্রিপ্টটি বিলম্ব করুন' ডিফল্ট সেটিংস 'কনফিগার করা হয়নি' এটি 5 মিনিটের বিলম্ব ছাড়বে লগইন স্ক্রিপ্ট চালানোর আগে।


1

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