Як запустити EXE-файл у PowerShell з параметрами з пробілами та лапками


332

Як запустити таку команду в PowerShell?

C: \ програмні файли \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Джерело даних = mysource; інтегрована безпека = false; ідентифікатор користувача = sa; Pwd = sapass!; База даних = mydb;" -dest: dbfullsql = "Джерело даних =. \ mydestsource; Комплексна безпека = false; Ідентифікатор користувача = sa; Pwd = sapass!; База даних = mydb;", ім'я комп'ютера = 10.10.10.10, ім'я користувача = адміністратор, пароль = адміністрування "



Якщо ви маєте на увазі літералі "в PowerShell" (що я трактую як "всередині існуючого запиту PowerShell"), то наступний приклад можна легко порівняти відповідно до ваших потреб. Зауважте, немає необхідності відокремлювати команду від її параметрів: # 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))
user3785010

Я не маю уявлення, як використовувати "міні-розмітку" для редагування вищевказаного коментаря, щоб кожен рядок коду відображався в окремому рядку, а 5-хвилинний термін на редагування оригінального коментаря минув. Якщо хтось зараз знає, щоб використати "міні-відмітку", щоб вирішити проблему, я відправлю його в більш читаному вигляді. Перший рядок повинен бути наступним: # Показати будь-які доступні оновлення глобально встановлених пакетів npm за допомогою інструменту npm-check-updates
user3785010

Відповіді:


346

Коли PowerShell бачить команду, починаючи з рядка, вона просто оцінює рядок, тобто, як правило, повторює її на екрані, наприклад:

PS> "Hello World"
Hello World

Якщо ви хочете, щоб PowerShell інтерпретував рядок як ім'я команди, тоді використовуйте оператор виклику (&) так:

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

Після цього вам, ймовірно, потрібно лише цитувати пари параметрів / аргументів, які містять пробіли та / або таблиці цитат. Коли ви викликаєте такий файл EXE зі складними аргументами командного рядка, зазвичай дуже корисно мати інструмент, який покаже вам, як PowerShell надсилає аргументи до файлу EXE. PowerShell Community Extensions має такий інструмент. Його називають ехоаргами. Ви просто замінюєте файл EXE echoargs - залишаючи всі аргументи на місці, і він покаже, як файл 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>

Використовуючи echoargs, ви можете експериментувати, поки не зрозумієте, наприклад:

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 викреслить їх.

BTW, капелюхи для команди PowerShell. Вони були дуже корисними, показавши мені конкретний запас одинарних та подвійних лапок, щоб отримати бажаний результат - якщо вам потрібно було зберегти внутрішні подвійні лапки. :-) Вони також усвідомлюють, що це область болю, але їх визначає кількість людей, які впливають на певну проблему. Якщо це біль для вас, тоді, будь ласка, проголосуйте за подання про помилку PowerShell .

Для отримання додаткової інформації про те, як PowerShell розбирає, перегляньте мою серію ефективних блогів PowerShell - зокрема пункт 10 - "Розуміння режимів розбору PowerShell"

ОНОВЛЕННЯ 4/4/2012: Ця ситуація стає набагато простішою в PowerShell V3. Детальну інформацію див. У цій публікації в блозі .


1
якщо я використовую як другий приклад, я отримую цю помилку: Помилка: Нерозпізнаний аргумент '"-source: dbfullsql =" "" Дані ". Усі аргументи повинні починатися з "-".
Vans

2
Вибачте, я не розумію. Я бачу, що на даний момент 6 людей схвалили відповідь, тому я пропускаю щось очевидне, але яка реальна відповідь? Чи існує спеціальне правило, яке потрібно знати про параметри з пробілами в PowerShell, або ви просто пропонуєте взяти це в кожному конкретному випадку, використовуючи EchoArgs?
Тайлер Коллер

Цитування аргументів зазвичай достатньо, але не завжди. У тих випадках, коли це не працює, використання echoargsвказує на те, як PowerShell інтерпретує аргументи, перш ніж передавати їх в EXE.
Кіт Хілл

1
Чи знаєте ви, як я це зробив у файлі .bat? Я намагаюся & 'C:\Program Files\Sublime Text 3\sublime_text.exe'безпосередньо в консолі, і вона працює, але в пакетному файлі я отримую помилку, що говорить "& було несподівано в цей час".
Джо Зім

Не звертай уваги. Знайшов:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Джо Зім

61

Просто додайте & оператор перед ім'ям .exe. Ось команда встановити SQL Server Express в режимі беззвучності:

$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
імхо це найкраще! немає base64, не дивно - синтаксис%, який перемикає заміну, нормальні правила заміщення оболонок, без плутанини, дуже читабельні.
AnneTheAgile

1
Це не працює. Якщо ваш параметр містить ім'я шляху, ім'я шляху буде розділено на кілька параметрів.
BrainSlugs83

1
Гарна відповідь. Однак, чи буде це працювати з цитатами в параметрах?
Акіра Ямамото

Спробуйте це, після того, як все інше справді спрацювало. А також скористайтеся розширенням PowershellEchoArgs
Джеремі Томпсон

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

Microsoft має зробити цей спосіб простішим та суміснішим із синтаксисом командного рядка.


2
Масив, безумовно, найкращий варіант - для мене це спрацювало чудово. За винятком того, що я передав змінну масиву, оскільки мої аргументи були динамічними. Дякую.
Джон Баркер

Найкраще рішення ІМХО
Васин Юрій

25

Існує досить багато методів, які ви можете використовувати для цього.

Існують і інші методи, наприклад використання оператора викликів ( & ), командлету Invoke-Expression тощо. Але вони вважаються небезпечними. Microsoft рекомендує використовувати Start-Process .

Спосіб 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"

У цьому методі ви відокремлюєте кожен параметр у ArgumentList за допомогою коми.

Спосіб 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"

Цей спосіб простіший, оскільки дозволяє вводити параметри за один раз.

Зауважте, що в повному шрифті для відображення лапки (") у рядку слід вставити мовний наголос (`) (Це клавіша над клавішею Tab на клавіатурі США).

Параметр -NoNewWindow використовується для відображення нового процесу у поточному вікні консолі. За замовчуванням Windows PowerShell відкриває нове вікно.

Список літератури: Powershell / Scripting / Start-Process


Простий завжди перемагає! Дякую.
Майк Касас

Дякуємо за остаточну записку про втечу лапки!
Паоло


13

Якщо хтось задається питанням, як запустити виконуваний файл:

.....>. \ file.exe

або

......> повний \ шлях \ до \ file.exe


2
Це має бути відповіддю на це запитання, це те, що ми шукаємо під час пошуку за ключовими словами «Почати EXE з PowerShell». Дякую !
Жан-Даніель Гассер

2
Як щодо запуску з аргументами?
SereneWizard

1
@SereneWizard Ну, додайте їх після .exe з пробілом між ними. Приклад:. \ File.exe param1 param2 param3
darkgaze

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

Ключові моменти:

  • Використовуйте лапки навколо аргументу джерела та видаліть вбудовані лапки навколо рядка з'єднання
  • Використовуйте альтернативні імена ключів при побудові рядка з'єднання SQL, у якому немає пробілів. Наприклад, використовуйте "UID" замість "User ID", "Server" замість "Джерело даних", "Trusted_Connection" замість "Integrated Security" тощо. Мені вдалося змусити його працювати лише після того, як я видалив усі пробіли з рядка з'єднання.

Я не намагався додати частину "ім'я комп'ютера" в кінці командного рядка, але, сподіваємось, ця інформація допоможе іншим, хто читає це, наблизитися до бажаного результату.


2
Я спробував усі інші відповіді, але це була єдина відповідь, яка працювала на мене! Дякуємо, що надали цей альтернативний шлях.
сентенція

6

Новий рядок виходу в PowerShell V3, цитується з Нових особливостей мови V3 :

Легше повторне використання командних рядків із Cmd.exe

В Інтернеті повно командних рядків, написаних для Cmd.exe. У команді PowerShell ці рядки команд працюють досить часто, але коли вони включають певні символи, наприклад, крапку з комою (;), знак долара ($) або фігурні фігурні дужки, вам доведеться внести деякі зміни, ймовірно додавши деякі лапки. Це здавалося джерелом багатьох незначних головних болів.

Щоб вирішити цей сценарій, ми додали новий спосіб «уникнути» розбору командних рядків. Якщо ви використовуєте магічний параметр -%, ми припиняємо наш звичайний аналіз вашого командного рядка і переходимо на щось набагато простіше. Ми не співпадаємо з цитатами. Ми не зупиняємось на крапці з комою. Ми не розширюємо змінні PowerShell. Ми розширюємо змінні середовища, якщо ви використовуєте синтаксис Cmd.exe (наприклад,% TEMP%). Крім цього, аргументи до кінця рядка (або труби, якщо ви працюєте з трубопроводом) передаються як є. Ось приклад:

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"

Головне, що тут слід зазначити, це те, що FilePath повинен знаходитись у положенні 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"""

Ключовим моментом є те, що вся команда укладена у зовнішні лапки, амперсанд "&" використовується для вказівки, що виконується ще один дочірній командний файл, а потім, нарешті, уникнуті (подвоєні-подвійні) лапки навколо імені шляху / файлу з пробілами у вас хотіли стратити в першу чергу.

Це також є завершенням єдиного вирішення проблеми з підключенням MS, що -File не передає назад нульові коди повернення, а -Command є єдиною альтернативою. Але до цього часу вважалося обмеженням -Команда в тому, що він не підтримує пробіли. Я також оновив цей елемент відгуку.

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


1
Це не пов’язано з питанням ops, він спеціально запитав, як виконати довгу команду на своїй посаді в powerhell. Не як запустити скрипт powerhell з пробілами у шляху до файлу.
leinad13

Прочитайте заголовок питання, пробіли - це питання не довжина. Це одна вагома відповідь на подібні проблеми, якими варто ділитися. У вас була така ж проблема і насправді її спробувати? Якщо ви хочете вдосконалити його, надішліть редагування, яке містить фактичну команду у запитанні, і я прийму його.
Tony Wall

3

Альтернативна відповідь - використовувати командований комутаційний перемикач Base64 :

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"

Це перетворюється на це, коли кодується як Base64:

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

Ви можете запускати EXE-файли в повному обсязі різними способами. Наприклад, якщо ви хочете запустити unrar.exe і витягнути .rar файл, ви можете просто написати в powershell це:

$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 (інструмент для управління віртуальними машинами virtualbox) потрібно викликати параметри за межами рядка, як це, без лапок:

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

Якщо ви хочете викликати файл з архівом winrar як .exe-файли, ви можете також розпакувати його командлетом invoke-command та параметром Silent / S (його буде витягнуто в тій самій папці, ніж там, де він був стиснутий).

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

Отже, існує кілька способів запуску .exe-файлів з аргументами в powershell.

Іноді потрібно знайти вирішення, щоб змусити його працювати належним чином, що може зажадати додаткових зусиль і болю :) залежно від способу складання .exe або створення його творців.


1

Я використовую цей простий, чистий та ефективний метод.

Я розміщую аргументи в масиві, 1 на рядок. Таким чином дуже легко читати та редагувати. Тоді я використовую просту хитрість передачі всіх аргументів всередині подвійних лапок до функції з одним єдиним параметром. Це згладжує їх, включаючи масиви, до однієї рядка, яку я потім виконую за допомогою PS "Invoke-Expression" PS. Ця директива спеціально розроблена для перетворення рядка в команду, що виконується. Добре працює:

                    # 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 "-". "

Спробувавши всі можливі обхідні шляхи (успіху немає), я з’ясував, що Powershell на сервері (Windows 2008 R2) була версією 3.0, а мій ноутбук - 5.0. (ви можете використовувати "$ PSVersionTable", щоб переглянути версію).

Після оновлення Powershell до останньої версії він знову почав працювати.


1

Cmd може працювати з запущеним файлом exe, але Powershell не може. Я просто збираюся розібратися із запуском самого exe, оскільки у мене його немає. Якщо вам буквально потрібно надіслати подвійні лапки на аргумент зовнішньої команди, це ще одна проблема, яка висвітлена в іншому місці.

1) додайте папку EXE до свого шляху, можливо, у свій $ профіль

$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на новий рядок

Приклад рішення:

& {вираз-вираз "C: \ програмні файли \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql =` "Джерело даних = mysource; інтегрована безпека = false; ідентифікатор користувача = sa; Pwd = sapass !; База даних = mydb; `" -dest: dbfullsql = `" Джерело даних =. \ Mydestsource; Комплексна безпека = помилка; Ідентифікатор користувача = sa; Pwd = sapass!; База даних = mydb; `", ім'я комп'ютера = 10.10.10.10, ім'я користувача = адміністратор, пароль = адміністратор` ""}


0

Для виконуваного імені може бути використаний новий командлет псевдоніму, щоб уникнути роботи з пробілами або необхідності додавання виконуваного файлу до середовища $ PATH.

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

Перелік або зміна псевдонімів PS також див

PS> get-alias
PS> set-alias

З Джеффрі Хікс Aarticle

Інші відповіді стосуються аргументів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.