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


331

আপনি কীভাবে পাওয়ারশেলের নীচের কমান্ডটি চালাবেন?

সি: \ প্রোগ্রাম ফাইলসমূহ \ আইআইএস \ মাইক্রোসফ্ট ওয়েব ডিপ্লয় \ msdeploy.exe -verb: সিঙ্ক -সোর্স: dbfullsql = "ডেটা উত্স = মাইক্রোসফট; ইন্টিগ্রেটেড সিকিউরিটি = মিথ্যা; ইউজার আইডি = সা; পিডব্লুডি = স্যাপাস; ডাটাবেস = মাইডিবি;" -dest: dbfullsql = "ডেটা উত্স =। \ মাইডেস্টোর্সেস; ইন্টিগ্রেটেড সিকিউরিটি = মিথ্যা; ইউজার আইডি = সা; পিডব্লুড = sapass!; ডাটাবেস = মাইডিবি;", কম্পিউটারনেম = 10.10.10.10, ব্যবহারকারীর নাম = প্রশাসক, পাসওয়ার্ড = অ্যাডমিনপাস "



যদি আপনি লিটারেরলি "পাওয়ারশেল ইন" (যার অর্থ আমি "বিদ্যমান পাওয়ারশেল প্রম্পটের অভ্যন্তরে বোঝায়) বোঝায়, তবে নীচের উদাহরণটি আপনার প্রয়োজনীয়তা স্যুট করতে সহজেই অভিযোজিত হতে পারে Notice লক্ষ্য করুন কমান্ডটিকে এর পরামিতিগুলি থেকে আলাদা করার দরকার নেই: # Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
ব্যবহারকারীর 7835010

উপরের মন্তব্যটি সম্পাদনের জন্য "মিনি-মার্কডাউন" কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমার কোনও ধারণা নেই যে কোডের প্রতিটি লাইন একটি পৃথক লাইনে প্রদর্শিত হবে এবং মূল মন্তব্য সম্পাদনা করার জন্য 5 মিনিটের সময়সীমা শেষ হয়ে গেছে। সমস্যার সমাধানের জন্য যদি এখন কেউ "মিনি-মার্কডাউন" ব্যবহার করতে জানেন তবে আমি আরও পঠনযোগ্য আকারে পোস্ট করব। প্রথম লাইনটি কেবল নিম্নোক্ত হওয়া উচিত: # এনপিএম-চেক-আপডেট সরঞ্জামটি ব্যবহার করে বিশ্বব্যাপী ইনস্টলড এনপিএম প্যাকেজগুলির যে কোনও উপলভ্য আপডেটগুলি দেখান
ব্যবহারকারী 3785010

উত্তর:


346

পাওয়ারশেল যখন একটি কমান্ডটি একটি স্ট্রিং দিয়ে শুরু করে দেখেন কেবল স্ট্রিংটির মূল্যায়ন করে, এটি সাধারণত এটি স্ক্রিনে প্রতিধ্বনিত হয়, উদাহরণস্বরূপ:

PS> "Hello World"
Hello World

আপনি যদি পাওয়ারশেলকে কমান্ডের নাম হিসাবে স্ট্রিংটির ব্যাখ্যা করতে চান তবে কল অপারেটর (&) এর মতো ব্যবহার করুন:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

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

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

ইকোয়ার্গস ব্যবহার করে আপনি এটি সঠিক না হওয়া পর্যন্ত আপনি পরীক্ষা করতে পারবেন, উদাহরণস্বরূপ:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

দেখা যাচ্ছে সংযোগের স্ট্রিংয়ের চারপাশে ডাবল উদ্ধৃতি বজায় রাখার আগে আমি খুব চেষ্টা করে যাচ্ছিলাম। স্পষ্টতই এটি প্রয়োজনীয় নয় কারণ এমনকি cmd.exe এগুলি ছিনিয়ে নেবে।

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

পাওয়ারশেল কীভাবে পার্স করে সে সম্পর্কে আরও তথ্যের জন্য, আমার কার্যকর পাওয়ারশেল ব্লগ সিরিজটি দেখুন - বিশেষত আইটেম 10 - "পাওয়ারশেল পার্সিং মোডগুলি বোঝা"

আপডেট 4/4/2012: পাওয়ারশেল ভি 3 এ পরিচালনা করা এই পরিস্থিতিটি অনেক সহজ হয়ে যায়। বিস্তারিত জানার জন্য এই ব্লগ পোস্ট দেখুন ।


1
যদি দ্বিতীয় উদাহরণ হিসাবে ব্যবহার করা হয় তবে আমি এই ত্রুটিটি পেয়েছি: ত্রুটি: অজ্ঞাত যুক্তি '' -সুত্র: dbfullsql = "" "ডেটা '। সমস্ত যুক্তি "-" দিয়ে শুরু করা উচিত।
ভ্যান

2
আমি দুঃখিত, আমি বুঝতে পারি না। আমি দেখতে পাচ্ছি যে, বর্তমানে 6 জন উত্তরটি আপগ্রেটেড করেছে যাতে আমি স্পষ্টত কিছু মিস করছি তবে আসল উত্তরটি কী? পাওয়ারশেলের ফাঁকা জায়গাগুলির সাথে পরামিতিগুলি সম্পর্কে কি বিশেষ কোনও নিয়ম জানা আছে বা আপনি ইকোআর্গসকে সাহায্যের জন্য ব্যবহার করে একে কেস-কেস-কেস নেওয়ার পরামর্শ দিচ্ছেন?
টাইলার কলিয়ার

যুক্তিগুলির উদ্ধৃতি সাধারণত পর্যাপ্ত তবে সর্বদা নয় not এই ক্ষেত্রে যেখানে এটি কাজ করে না, ব্যবহার করে echoargsপাওয়ারশেল কীভাবে আর্গুমেন্টগুলিকে এটি এক্সের মধ্যে যাওয়ার আগে তা ব্যাখ্যা করে তা বোঝায়।
কিথ হিল

1
আপনি কি জানেন কীভাবে আমি .bat ফাইলে এটি করব? আমি & 'C:\Program Files\Sublime Text 3\sublime_text.exe'সরাসরি কনসোলে চেষ্টা করছি এবং এটি কাজ করছে, তবে একটি ব্যাচের ফাইলে আমি 'এবং এই সময়ে অপ্রত্যাশিত ছিল' বলে ত্রুটি পেয়েছি।
জো জিম

কিছু মনে করো না. এটি খুঁজে START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
জো জিম

61

.Exe নামের আগে কেবল & অপারেটর যুক্ত করুন । নীরবতা মোডে এসকিউএল সার্ভার এক্সপ্রেস ইনস্টল করার জন্য এখানে একটি আদেশ রয়েছে:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

কমান্ড এবং প্যারামিটার উভয় ক্ষেত্রেই আমার স্পেস ছিল এবং এটি আমার পক্ষে কাজ করেছে:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

এটি মূলত আকিরার উত্তরের সমান, তবে আপনি যদি আপনার কমান্ডের প্যারামিটারগুলি গতিশীলভাবে তৈরি করেন এবং এগুলিকে পরিবর্তনশীল করে রাখেন তবে এটি কাজ করে।


2
ইমো এই সেরা! কোন বেস 64 নেই, কোনও আশ্চর্য নয় -% সিনট্যাক্স যা প্রতিস্থাপনকে টগল করে, সাধারণ পাওয়ারশেলে প্রতিস্থাপনের নিয়ম করে, কোনও বিভ্রান্তি হয় না, খুব পাঠযোগ্য।
অ্যান দি অ্যাজিল 20'15

1
এটি কাজ করে না। যদি আপনার প্যারামিটারটিতে একটি পাথের নাম থাকে তবে পথের নামটি একাধিক পরামিতিগুলিতে বিভক্ত হবে।
BrainSlugs83

1
চমৎকার উত্তর. তবে, এটি পরামিতিগুলিতে উদ্ধৃতি দিয়ে কাজ করবে?
আকিরা ইয়ামামোতো

দয়া করে এটি চেষ্টা করুন, অন্য সব কিছুর পরেও এটি বাস্তবে কাজ করেছে। এবং পাওয়ারশেল এক্সটেনশনটিও ব্যবহার করুনEchoArgs
জেরেমি থম্পসন

34

এটি আমার পক্ষে কাজ করেছে:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

কেবল একটি অ্যারে আইটেমে পাথ বা সংযোগের স্ট্রিং রাখুন এবং অন্যান্য জিনিসগুলিকে প্রতিটি অ্যারে আইটেমে ভাগ করুন।

এখানে অন্যান্য অনেক অপশন রয়েছে: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

মাইক্রোসফ্টকে কমান্ড প্রম্পট সিনট্যাক্সের সাথে এই পদ্ধতিটিকে সহজ এবং সামঞ্জস্যপূর্ণ করা উচিত।


2
অ্যারে অবশ্যই সেরা বিকল্প - এটি আমার পক্ষে দুর্দান্ত কাজ করেছে। আমি আরে ভেরিয়েবলটি ব্যতীত পাস করেছি কারণ আমার যুক্তিগুলি গতিশীল ছিল। ধন্যবাদ।
জন বার্কার 16

IMHO সেরা সমাধান
ভাসিন ইউরি

24

এটি করতে আপনি বেশ কয়েকটি পদ্ধতি ব্যবহার করতে পারেন।

কল অপারেটর ( এবং ), ইনভোক-এক্সপ্রেশন সেমিডলেট ইত্যাদি ব্যবহারের মতো অন্যান্য পদ্ধতি রয়েছে তবে সেগুলি অনিরাপদ হিসাবে বিবেচিত হয়। মাইক্রোসফ্ট স্টার্ট-প্রক্রিয়া ব্যবহারের পরামর্শ দেয় ।

পদ্ধতি 1

একটি সহজ উদাহরণ

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

আপনার ক্ষেত্রে

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

এই পদ্ধতিতে আপনি প্রতিটি প্যারামিটারটি কমা ব্যবহার করে আরগমেন্টলিস্টে পৃথক করেন।

পদ্ধতি 2

সাধারণ উদাহরণ

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

আপনার ক্ষেত্রে

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

এই পদ্ধতিটি আরও সহজ কারণ এটি একসাথে আপনার পরামিতিগুলি টাইপ করতে দেয়।

নোট করুন যে পাওয়ারশেলে একটি স্ট্রিংয়ে উদ্ধৃতি চিহ্ন (") উপস্থাপন করার জন্য আপনাকে গ্রাভ অ্যাকসেন্ট (`) sertোকানো উচিত (এটি মার্কিন কীবোর্ডের ট্যাব কী এর উপরে কী))।

-NoNewWindow পরামিতি বর্তমান কনসোল উইন্ডোতে নতুন প্রক্রিয়া প্রদর্শন করতে ব্যবহৃত হয়। ডিফল্টরূপে উইন্ডোজ পাওয়ারশেল একটি নতুন উইন্ডো খোলে।

তথ্যসূত্র: পাওয়ারশেল / স্ক্রিপ্টিং / শুরু-প্রক্রিয়া


সরল সবসময় জয়! ধন্যবাদ।
মাইক ক্যাসাস

উদ্ধৃতি চিহ্নটি এড়ানোর জন্য চূড়ান্ত নোটের জন্য ধন্যবাদ!
পাওলো


13

যদি কেউ ভাবছেন যে কীভাবে কেবল একটি এক্সিকিউটেবল ফাইল চালানো যায়:

.....>। \ file.exe

অথবা

......> ফাইল ex এক্সি থেকে পূর্ণ \ পথ


2
এটি এই প্রশ্নের উত্তর হওয়া উচিত, "পাওয়ারশেল থেকে শুরু করা EXE" কীওয়ার্ড দিয়ে অনুসন্ধান করার সময় আমরা এটির সন্ধান করছি। ধন্যবাদ !
জিন-ড্যানিয়েল গ্যাসার

2
যুক্তি নিয়ে দৌড়াদৌড়ি সম্পর্কে কীভাবে?
সেরেনিউজার্ড

1
@ সেরিনউইজার্ড ওয়েল, এগুলিকে অন্তর্ভুক্ত করে একটি স্পেস সহ .exe এর পরে যুক্ত করুন। উদাহরণ: \ file.exe param1 param2 param3
অন্ধকার

9

আমি নিম্নলিখিত পদ্ধতির সাহায্যে আমার অনুরূপ কমান্ডটি কাজ করতে সক্ষম হয়েছি:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

আপনার কমান্ডের জন্য (এটি এখন খুব বেশি সহায়তা করে না), জিনিসগুলি দেখতে এরকম কিছু দেখায়:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

মূল বিষয়গুলি হ'ল:

  • উত্স আর্গুমেন্টের চারপাশে উদ্ধৃতিগুলি ব্যবহার করুন এবং সংযোগ স্ট্রিংয়ের আশেপাশে এম্বেড করা উক্তিগুলি সরান
  • এসকিউএল সংযোগের স্ট্রিং তৈরিতে বিকল্প কী নাম ব্যবহার করুন যার মধ্যে শূন্যস্থান নেই। উদাহরণস্বরূপ, "ইউজার আইডি" এর পরিবর্তে "ইউআইডি", "ডেটা উত্স" এর পরিবর্তে "সার্ভার", "ইন্টিগ্রেটেড সিকিউরিটি" এর পরিবর্তে "বিশ্বস্ত_ সংযোগ" এবং আরও কিছু ব্যবহার করুন। আমি কেবল সংযোগের স্ট্রিং থেকে সমস্ত স্পেস সরিয়ে ফেললেই এটি কাজ করতে সক্ষম হয়েছি।

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


2
আমি অন্য সমস্ত উত্তর চেষ্টা করেছিলাম, তবে এটিই ছিল আমার পক্ষে একমাত্র উত্তর! এই বিকল্প পথ সরবরাহ করার জন্য ধন্যবাদ।
সংবেদী

6

পাওয়ারশেল ভি 3-তে নতুন পালানোর স্ট্রিং, এর থেকে উদ্ধৃত 3 ভাষার বৈশিষ্ট্য:

Cmd.exe থেকে কমান্ড লাইনের সহজ পুনঃব্যবহার

ওয়েবটি Cmd.exe এর জন্য লিখিত কমান্ড লাইনে পূর্ণ। এই কমান্ড লাইনগুলি প্রায়শই পাওয়ারশেলের পর্যাপ্ত পরিমাণে কাজ করে, তবে যখন সেগুলিতে নির্দিষ্ট অক্ষর অন্তর্ভুক্ত থাকে, উদাহরণস্বরূপ, একটি সেমিকোলন (;), ডলারের চিহ্ন ($), বা কোঁকড়া ধনুর্বন্ধনী, আপনাকে কিছু পরিবর্তন করতে হবে, সম্ভবত কিছু উদ্ধৃতি যুক্ত করতে হবে। এটি অনেকগুলি ছোটখাটো মাথা ব্যথার উত্স বলে মনে হয়েছিল।

এই দৃশ্যের সমাধানে সহায়তা করার জন্য, আমরা কমান্ড লাইনের পার্সিং "পালাতে" একটি নতুন উপায় যুক্ত করেছি। আপনি যদি কোনও ম্যাজিক প্যারামিটার -% ব্যবহার করেন তবে আমরা আপনার কমান্ড লাইনের সাধারণ পার্সিং বন্ধ করি এবং আরও সহজ কিছুতে স্যুইচ করি। আমরা উদ্ধৃতি মেলে না। আমরা সেমিকোলনে থামি না। আমরা পাওয়ারশেল ভেরিয়েবলগুলি প্রসারিত করি না। আপনি যদি Cmd.exe সিনট্যাক্স (যেমন% TEMP%) ব্যবহার করেন তবে আমরা পরিবেশের পরিবর্তনগুলি প্রসারিত করব। এগুলি ছাড়া লাইনের শেষ পর্যন্ত যুক্তিগুলি (বা পাইপ, আপনি যদি পাইপ দিচ্ছেন) যেমন হয় তেমন পাস হয় are এখানে একটি উদাহরণ:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>

6

তুমি ব্যবহার করতে পার:

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

এখানে গুরুত্বপূর্ণ বিষয়টি লক্ষ্যণীয় হ'ল সহায়তাপথ অনুসারে ফাইলপথ অবশ্যই 0 পজিশনে থাকতে হবে। কমান্ডলেটের জন্য সহায়তা সহায়তার জন্য অনুরোধ করুন, কেবল টাইপ করুন Get-Help <Commandlet-name> -Detailed। এই ক্ষেত্রে, এটি হয় Get-Help Start-Process -Detailed


এটি আমার জন্য তখন কাজ করেছিল যখন &ছিল না
কলব ক্যানিয়ন

5

আমি সমস্ত প্রস্তাবনা চেষ্টা করেছিলাম কিন্তু এখনও msiexec.exeস্পেস রয়েছে এমন পরামিতিগুলির সাথে চালাতে অক্ষম । সুতরাং আমার সমাধানটি ব্যবহার করে শেষ হয়েছে System.Diagnostics.ProcessStartInfo:

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()

3

এটি আমার পক্ষে কাজ করেছে:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

কীটি দেখে মনে হচ্ছে পুরো কমান্ডটি বাইরের উদ্ধৃতিতে আবদ্ধ রয়েছে, "&" অ্যাম্পারস্যান্ডটি অন্য শিশু কমান্ড ফাইলটি নির্বাহ করা হচ্ছে তা নির্দিষ্ট করতে ব্যবহৃত হয়, তারপরে অবশেষে ফাঁকা স্থানের সাথে পথ / ফাইলের নামের চারপাশে (দ্বিগুণ-ডাবল) উদ্ধৃতি পাওয়া যায় আপনি প্রথম স্থানে কার্যকর করতে চেয়েছিলেন।

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

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option


1
এটি অপশাসনের প্রশ্নের সাথে সম্পর্কিত নয়, তিনি বিশেষত জিজ্ঞাসা করেছিলেন কীভাবে পাওয়ারশেলে তার পদটিতে লং কমান্ড চালানো যায়। ফাইল পাথের ফাঁকা স্থানের সাথে কীভাবে পাওয়ারশেল স্ক্রিপ্টটি চালানো যায়।
লিনাদ 13

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

3

একটি বিকল্প উত্তর একটি বেস 64 এনকোডড কমান্ড স্যুইচ ব্যবহার করা হয়:

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

ডিকোড করা হয়ে গেলে, আপনি দেখতে পাবেন যে এটি সমস্ত ওপেনের মূল স্নিপেট এবং সমস্ত আর্গুমেন্ট এবং ডাবল উদ্ধৃতি সংরক্ষিত রয়েছে।

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

মূল আদেশ:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

বেস 64 হিসাবে এনকোড করা হলে এটি এতে পরিণত হয়:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

এবং বাড়িতে কীভাবে প্রতিলিপি করা যায় তা এখানে:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip

3

আপনি পাওয়ার শেলের বিভিন্ন উপায়ে এক্সপি ফাইলগুলি চালাতে পারেন। উদাহরণস্বরূপ আপনি যদি আনআরআর.আর.কে চালনা করতে চান এবং একটি .রার ফাইলটি বের করতে চান তবে আপনি এটিকে কেবল ক্ষমতাচক্র এ লিখতে পারেন:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

তবে কখনও কখনও, এটি কাজ করে না তাই আপনার অবশ্যই উপরে বর্ণিত হিসাবে প্যারামিটারটি ব্যবহার করতে হবে: উদাহরণস্বরূপ, vboxmanage.exe (ভার্চুয়ালবক্স ভার্চুয়াল মেশিনগুলি পরিচালনা করার একটি সরঞ্জাম) দিয়ে আপনাকে অবশ্যই পংক্তির বাইরে প্যারামটারগুলি কল করতে হবে:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

আপনি যদি কেবল উইনার আর্কাইভ করা ফাইলটিকে .exe ফাইল হিসাবে কল করতে চান তবে আপনি এভলক-কমান্ড cmdlet এবং একটি সাইলেন্ট প্যারামিটার / এস দিয়ে এটি আনজিপ করতে পারেন (এটি সংকোচিত হয়েছে যেখানে তার তুলনায় এটি একই ফোল্ডারে নিজেই বের করতে চলেছে)।

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

সুতরাং পাওয়ার শেলের মধ্যে আর্গুমেন্ট সহ .exe ফাইলগুলি চালনার বেশ কয়েকটি উপায় রয়েছে।

কখনও কখনও, এটির যথাযথভাবে কাজ করতে একজনকে অবশ্যই অবশ্যই এক ত্রুটিযুক্ত সন্ধান করতে হবে, যার জন্য আরও কিছু প্রচেষ্টা এবং ব্যথার প্রয়োজন হতে পারে :) .Ex এর পদ্ধতিটি এর নির্মাতাদের কীভাবে সংকলন করা হয়েছে বা তৈরি করা হয়েছে তার উপর নির্ভর করে।


1

আমি এই সহজ, পরিষ্কার এবং কার্যকর পদ্ধতিটি ব্যবহার করি।

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

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";

1

আমার ল্যাপটপে নিচের কোডটি নিখুঁতভাবে কাজ করেছে:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

তারপরে যখন আমি সরাসরি এটি একটি সার্ভারে চালানোর চেষ্টা করি তখন আমি সেই ত্রুটিগুলি পেতে শুরু করি "Unrecognized argument ...etc.... All arguments must begin with "-". "

সমস্ত সম্ভাব্য কাজের চেষ্টা (কোনও সাফল্য নয়) চেষ্টা করার পরে, আমি জানতে পেরেছিলাম যে সার্ভারে পাওয়ারশেল (উইন্ডোজ ২০০৮ আর 2) সংস্করণ ৩.০ ছিল, যখন আমার ল্যাপটপে ৫.০ রয়েছে। (সংস্করণ দেখতে আপনি "$ PSVersionTable" ব্যবহার করতে পারেন)।

পাওয়ারশেলকে সর্বশেষ সংস্করণে আপগ্রেড করার পরে এটি আবার কাজ শুরু করে।


1

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

1) আপনার to প্রোফাইলে আপনার পথে এক্সে ফোল্ডার যুক্ত করুন

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2) স্পেসগুলি ব্যাককোট

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe

0

সুতরাং, আমি একটি অনুরূপ সমস্যার মধ্যে দৌড়েছি এবং এর পরিবর্তে এইভাবে সমাধান করা বেছে নিয়েছি:

  1. ব্যাকটিক (`) দিয়ে আপনার উক্তি (") অক্ষরগুলি এড়িয়ে চলুন
  2. উদ্ধৃতি (") সহ আপনার নতুন অভিব্যক্তি ঘিরে
  3. কল অপারেটর (এবং) ব্যবহার করে invoke-expressionনতুন স্ট্রিং- এ কমান্ডটি জারি করুন

উদাহরণ সমাধান:

& {অনুরোধ-এক্সপ্রেশন "সি: \ প্রোগ্রাম ফাইলগুলি \ আইআইএস \ মাইক্রোসফ্ট ওয়েব ডিপ্লোয় \ msdeploy.exe -verb: সিঙ্ক -সোর্স: dbfullsql =` "ডেটা উত্স = মাইক্রোসফট; ইন্টিগ্রেটেড সুরক্ষা = মিথ্যা; ইউজার আইডি = সা; পিডব্লুড = স্যাপাস !; ডাটাবেস = mydb; `" -ডেসট: dbfullsql = `" ডেটা উত্স =। \ মায়াইডেস্টোর্স; ইন্টিগ্রেটেড সিকিউরিটি = মিথ্যা; ইউজার আইডি = সা; পিডব্লুড = sapass! ডাটাবেস = mydb; `", সংকলন = 10.10.10.10, ব্যবহারকারীর নাম = প্রশাসক, পাসওয়ার্ড = অ্যাডমিনপাস` ""}


0

এক্সিকিউটেবল নামের জন্য, নতুন-ওরফে সিএমডিলেটটি ফাঁকা জায়গাগুলি মোকাবেলা করতে বা $ PATH পরিবেশে এক্সিকিউটেবল যুক্ত করার প্রয়োজন এড়াতে নিয়োগ করা যেতে পারে।

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

পিএস এলিয়াস তালিকাবদ্ধ বা সংশোধন করতে এছাড়াও দেখুন

PS> get-alias
PS> set-alias

থেকে Jeffery Hicks আপনি Aarticle

অন্যান্য উত্তরগুলি আর্গুমেন্টগুলিকে সম্বোধন করে।

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