PowerShell'de boşluklar ve tırnak işaretleri içeren parametrelerle bir EXE dosyası nasıl çalıştırılır


333

PowerShell'de aşağıdaki komutu nasıl çalıştırırsınız?

C: \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Veri Kaynağı = mysource; Tümleşik Güvenlik = yanlış; Kullanıcı Kimliği = sa; Pwd = sapass!; Veritabanı = mydb;" -dest: dbfullsql = "Veri Kaynağı =. \ mydestsource; Tümleşik Güvenlik = yanlış; Kullanıcı Kimliği = sa; Pwd = sapass!; Veritabanı = mydb;", bilgisayar adı = 10.10.10.10, kullanıcı adı = yönetici, şifre = adminpass "



Eğer "mevcut bir PowerShell isteminde" demek istediğim "anlamıyla" kelimenin tam anlamıyla "kastediyorsanız, aşağıdaki örnek ihtiyaçlarınıza göre kolayca uyarlanabilir. Komutun parametrelerini ayırmasına gerek yoktur: # 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

Her kod satırı ayrı bir satırda görünmesini sağlamak için yukarıdaki yorumu düzenlemek için "mini-markdown" nasıl kullanılacağı hakkında hiçbir fikrim yok ve orijinal yorum düzenleme 5 dakikalık süre sona erdi. Sorunu çözmek için şimdi "mini-Markdown" kullanmayı bilen biri varsa, daha okunabilir bir biçimde yeniden yayınlayacağım. İlk satır sadece şu şekilde olmalıdır: # npm-check-updates aracını kullanarak global olarak kurulmuş npm paketlerindeki mevcut güncellemeleri göster
user3785010

Yanıtlar:


347

PowerShell bir dize ile başlayan bir komut gördüğünde, sadece dizeyi değerlendirir, yani genellikle ekrana yansıtır, örneğin:

PS> "Hello World"
Hello World

PowerShell'in dizeyi komut adı olarak yorumlamasını istiyorsanız, çağrı operatörünü (&) şu şekilde kullanın:

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

Bundan sonra muhtemelen sadece boşluklar ve / veya tırnak karakterleri içeren parametre / argüman çiftleri vermeniz gerekir. Karmaşık komut satırı argümanlarıyla böyle bir EXE dosyasını çağırdığınızda, PowerShell'in bağımsız değişkenleri EXE dosyasına nasıl gönderdiğini gösteren bir araca sahip olmak genellikle çok yararlıdır. PowerShell Topluluk Uzantıları böyle bir araç vardır. Buna yankılar denir. Sadece EXE dosyasını echoargs ile değiştirirsiniz - tüm argümanları yerinde bırakır ve EXE dosyasının argümanları nasıl alacağını gösterir, örneğin:

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>

Yankıları kullanarak doğru olana kadar deney yapabilirsiniz, örneğin:

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;>

Daha önce bağlantı dizesi etrafında çift tırnak korumak için çok çalışıyordum çıkıyor. Görünüşe göre bu gerekli değildir, çünkü cmd.exe bile bunları çıkaracaktır.

BTW, PowerShell ekibine şapka çıkarıyor. Eğer iç çift tırnak yerinde tutmak gerekirse - bana istenen sonucu elde etmek için tek ve çift tırnak özel büyüsünü gösteren oldukça yararlı. :-) Ayrıca bunun bir acı alanı olduğunu anlıyorlar, ancak belirli bir sorundan etkilenen kişi sayısından etkilendiler. Bu sizin için bir acı alanı ise, lütfen bu PowerShell hata sunumunu oylayın .

PowerShell'in ayrıştırma yöntemi hakkında daha fazla bilgi için, Etkili PowerShell blog serime bakın - özellikle madde 10 - "PowerShell Ayrıştırma Modlarını Anlama"

GÜNCELLEME 4/4/2012: Bu durumun PowerShell V3'te ele alınması çok daha kolay hale geliyor. Ayrıntılar için bu blog yayınına bakın .


1
ikinci örnek olarak kullanıyorsanız, bu hatayı alıyorum: Hata: Tanınmayan argüman '"-source: dbfullsql =" "" Veri'. Tüm argümanlar "-" ile başlamalıdır.
Vans

2
Üzgünüm, anlamıyorum. Görüyorum ki, şu anda 6 kişi cevabı iptal etti, bu yüzden bariz bir şeyi kaçırdım, ama asıl cevap nedir? PowerShell ile boşluk içeren parametreler hakkında bilmek için özel bir kural var mı, yoksa sadece yardım etmek için EchoArgs kullanarak duruma göre almayı mı öneriyorsunuz?
Tyler Collier

Argümanlardan alıntı yapmak genellikle yeterlidir, ancak her zaman değil. İşe yaramadığı durumlarda, kullanma echoargsPowerShell'in bağımsız değişkenleri EXE'ye geçirmeden önce nasıl yorumladığını gösterir.
Keith Hill

1
Bunu bir .bat dosyasında nasıl yapacağımı biliyor musunuz? & 'C:\Program Files\Sublime Text 3\sublime_text.exe'Doğrudan konsolda deniyorum ve çalışıyor, ancak bir toplu iş dosyasında '& şu anda beklenmedik' diyerek bir hata alıyorum.
Joe Zim

Boşver. Bulundu:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Joe Zim

61

& İşlecini .exe adının önüne eklemeniz yeterlidir. Sessizlik modunda SQL Server Express'i yüklemek için bir komut:

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

Hem komut hem de parametrelerde boşluklar vardı ve bu benim için işe yaradı:

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

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

Temelde Akira'nın cevabı ile aynıdır, ancak komut parametrelerinizi dinamik olarak oluşturup bir değişkene koyarsanız bu işe yarar.


2
imho bu en iyisi! base64 yok, yerine koymayı değiştiren garip -% sözdizimi, normal powershell yerine koyma kuralları, karışıklık yok, çok okunabilir.
AnneTheAgile

1
Bu işe yaramıyor. Parametrenizin içinde bir yol adı varsa, yol adı birden çok parametreye bölünecektir.
BrainSlugs83

1
Güzel cevap. Ancak, parametrelerde tırnak işaretleri ile çalışır mı?
Akira Yamamoto

Lütfen bunu deneyin, her şeyden sonra gerçekten işe yaradı. Ayrıca Powershell Uzantısını kullanınEchoArgs
Jeremy Thompson

34

Bu benim için çalıştı:

& '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')

Sadece bir dizi öğeye yollar veya bağlantı dizeleri koyun ve diğer şeyleri her biri bir dizi öğeye bölün.

Burada başka birçok seçenek var: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft bu yolu daha basit ve komut istemi sözdizimi ile uyumlu hale getirmelidir.


2
Dizi kesinlikle en iyi seçenek - bu benim için harika çalıştı. Argümanlarım dinamik olduğu için bir dizi değişkenini geçtim. Teşekkürler.
Jon Barker

IMHO en iyi çözüm
Vasin Yuriy

25

Bunu yapmak için kullanabileceğiniz birkaç yöntem vardır.

Çağrı İşleci ( & ), Çağırma-İfade cmdlet'i vb. Kullanmak gibi başka yöntemler de vardır . Ancak bunlar güvenli değildir. Microsoft, Başlat İşlemi kullanmanızı önerir .

Yöntem 1

Basit bir örnek

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

Senin durumunda

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"

Bu yöntemde, ArgumentList öğesindeki her parametreyi virgül kullanarak ayırırsınız.

Yöntem 2

Basit Örnek

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

Senin durumunda

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"

Bu yöntem, parametrelerinizi tek seferde yazmanıza izin verdiği için daha kolaydır.

Powershell'de , bir dizedeki tırnak işaretini (") temsil etmek için mezar aksanını (`) eklemeniz gerektiğini unutmayın (Bu, ABD klavyesinde Sekme tuşunun üstündeki anahtardır).

-NoNewWindow parametresi yeni işlemi geçerli konsol penceresinde görüntülemek için kullanılır. Varsayılan olarak Windows PowerShell yeni bir pencere açar.

Kaynaklar: Powershell / Scripting / Start-Process


Basit her zaman kazanır! Teşekkürler.
Mike Casas

Tırnak işaretinden kaçma konusundaki son not için teşekkürler!
Paolo


13

Birinin yürütülebilir bir dosyayı nasıl çalıştıracağını merak etmesi durumunda:

.....>. \ file.exe

veya

......> tam \ path \ to \ file.exe


2
Bu sorunun cevabı olmalı, "PowerShell'den EXE Başlat" anahtar kelimelerini aradığımızda aradığımız şey budur. Teşekkür ederim !
Jean-Daniel Gasser

2
Argümanlarla koşmaya ne dersiniz?
SereneWizard

1
@SereneWizard Eh, onları aralarında boşluk bırakarak .exe sonra ekleyin. Örnek:. \ File.exe param1 param2 param3
darkgaze

9

Aşağıdaki komutu kullanarak benzer komutumu çalıştırabildim:

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

Komuta için (şimdi çok yardımcı olduğu için değil), işler şöyle görünecektir:

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

Kilit noktalar:

  • Kaynak bağımsız değişkenin çevresindeki tırnak işaretlerini kullanın ve bağlantı dizesinin etrafındaki katıştırılmış tırnak işaretlerini kaldırın
  • İçinde boşluk olmayan SQL bağlantı dizesini oluştururken alternatif anahtar adlarını kullanın. Örneğin, "Kullanıcı Kimliği" yerine "UID", "Veri Kaynağı" yerine "Sunucu", "Tümleşik Güvenlik" yerine "Trusted_Connection" vb. Kullanın. Sadece bağlantı dizesinden tüm boşlukları kaldırdıktan sonra işe almak mümkün.

Komut satırının sonuna "bilgisayaradı" bölümünü eklemeyi denemedim, ama umarım bu bilgi bunu okuyan diğerlerinin istedikleri sonuca yaklaşmasına yardımcı olur.


2
Diğer tüm cevapları denedim, ama bu benim için işe yarayan tek cevaptı! Bu alternatif yolu sağladığınız için teşekkür ederiz.
Sentient

6

Yeni V3 Dil Özellikleri'nden alıntılanan PowerShell V3'teki yeni kaçış dizesi :

Komut Satırlarının Cmd.exe'den Daha Kolay Kullanımı

Web, Cmd.exe için yazılmış komut satırlarıyla doludur. Bu komut satırları PowerShell'de yeterince çalışır, ancak noktalı virgül (;), dolar işareti ($) veya süslü parantez gibi belirli karakterler içerdiklerinde, muhtemelen bazı tırnak işaretleri ekleyerek bazı değişiklikler yapmanız gerekir. Bu pek çok küçük baş ağrısının kaynağı gibi görünüyordu.

Bu senaryonun ele alınmasına yardımcı olmak için, komut satırlarının ayrıştırılmasından "kaçmak" için yeni bir yol ekledik. Sihirli bir parametre -% kullanırsanız, komut satırınızı normal olarak ayrıştırmamızı durdurur ve çok daha basit bir şeye geçeriz. Alıntılarla eşleşmiyoruz. Noktalı virgülle durmayız. PowerShell değişkenlerini genişletmiyoruz. Cmd.exe sözdizimini (örn.% TEMP%) kullanırsanız ortam değişkenlerini genişletiriz. Bunun dışında, satırın sonuna kadar olan argümanlar (veya boru kullanıyorsanız boru) olduğu gibi iletilir. İşte bir örnek:

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

6

Kullanabilirsiniz:

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"

Burada dikkat edilmesi gereken en önemli şey, Yardım Kılavuzuna göre FilePath'in 0 konumunda olması gerektiğidir. Bir komut dosyasına ilişkin Yardım kılavuzunu çağırmak için yazmanız yeterlidir Get-Help <Commandlet-name> -Detailed. Bu durumda, öyle Get-Help Start-Process -Detailed.


5

Tüm önerileri denedim ama yine de msiexec.exeboşluk içeren parametrelerle çalışamadım . Böylece çözümüm şu şekilde sonuçlandı 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

Bu benim için çalıştı:

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

Anahtar, tüm komutun dış tırnak içine alındığı, "&" "ve" işareti başka bir alt komut dosyasının yürütülmekte olduğunu belirtmek için kullanıldığından sonra son olarak boşlukla birlikte yol / dosya adı etrafında tırnaklar (çift-çift-) ilk etapta infaz etmek istediniz.

Bu aynı zamanda -File sıfır olmayan dönüş kodlarını geri vermez ve -Command tek alternatif MS bağlantı sorunu için tek geçici çözüm tamamlanmasıdır. Ancak şimdiye kadar -Command'ın bir sınırının boşlukları desteklemediği düşünülüyordu. Bu geri bildirim öğesini de güncelledim.

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


1
Bu ops sorusuyla ilgisizdir, özellikle powershell'deki görevinde uzun komutun nasıl çalıştırılacağını sordu. Powershell betiğinin dosya yolundaki boşluklarla nasıl çalıştırılacağı değil.
leinad13

Sorunun başlığını okuyun, boşluklar uzunluk değil sorun. Bu, bu tür sorunların paylaşılmaya değer geçerli bir cevabıdır. Aynı sorunla karşılaştınız ve gerçekten denediniz mi? Geliştirmek isterseniz, sorudaki gerçek komutu içeren bir düzenleme gönderin ve kabul edeceğim.
Tony Wall

3

Alternatif bir cevap, Base64 kodlu bir komut anahtarı kullanmaktır:

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Kod çözüldüğünde, OP'nin tüm argümanları ve çift tırnakları korunmuş orijinal snippet'i olduğunu göreceksiniz.

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.

Orijinal komut:

 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 olarak kodlandığında buna dönüşür:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

ve burada evde nasıl çoğaltılır:

$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 dosyalarını powershell ile farklı şekillerde çalıştırabilirsiniz. Örneğin, unrar.exe dosyasını çalıştırmak ve bir .rar dosyasını ayıklamak istiyorsanız, bunu powershell'de yazabilirsiniz:

$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;

Ancak bazen bu işe yaramaz, bu nedenle & parametresini yukarıda gösterildiği gibi kullanmanız gerekir: Örneğin, vboxmanage.exe (sanal kutu sanal makinelerini yönetmek için bir araç) ile parametreleri tırnak işaretleri olmadan dize dışında çağırmalısınız:

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

Bir winrar arşivlenmiş dosyayı .exe dosyaları olarak çağırmak istiyorsanız, invoke-komut cmdlet'i ve bir Silent parametresi / S (Sıkıştırıldığı yerden aynı klasörde kendisini ayıklayacaktır) ile dosyayı da açabilirsiniz.

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

Bu nedenle, powershell'de argümanlarla .exe dosyalarını çalıştırmanın birkaç yolu vardır.

Bazen, düzgün çalışması için bir çözüm bulmak gerekir, bu da biraz daha fazla çaba ve acı gerektirebilir :) .exe derlenmiş veya yaratıcıları bi yapılmış şekline bağlı olarak.


1

Bu basit, temiz ve etkili yöntemi kullanıyorum.

Bir diziye, her satıra 1 argüman yerleştiriyorum. Bu şekilde okunması ve düzenlenmesi çok kolaydır. Daha sonra çift tırnak içindeki tüm argümanları 1 tek parametreli bir fonksiyona geçirmenin basit bir hile kullanın. Bu, diziler de dahil olmak üzere onları tek bir dizeye yassılaştırır, daha sonra PS'nin 'Invoke-Expression'ı kullanarak yürütürüm. Bu yönerge, bir dizeyi runnable komutuna dönüştürmek için özel olarak tasarlanmıştır. İyi çalışıyor:

                    # 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

Dizüstü bilgisayarımda mükemmel çalışan aşağıdaki kodu vardı:

& $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"

Sonra bunu doğrudan bir sunucuda çalıştırmayı denediğimde bu hataları almaya başladım "Unrecognized argument ...etc.... All arguments must begin with "-". "

Tüm olası geçici çözümleri denedikten sonra (başarı yok), dizüstü bilgisayarım 5.0 iken sunucudaki Powershell'in (Windows 2008 R2) sürüm 3.0 olduğunu öğrendim. (sürümü görmek için "$ PSVersionTable" kullanabilirsiniz).

Powershell'i en son sürüme yükselttikten sonra tekrar çalışmaya başladı.


1

Cmd alıntılanan bir exe çalıştırabilir, ancak Powershell yapamaz. Ben sadece exe kendisi ile başa çıkacağım, çünkü ben yok. Kelimenin tam anlamıyla harici bir komutun argümanına çift tırnak göndermeniz gerekiyorsa, bu başka bir yerde ele alınan başka bir konudur.

1) exe klasörünü yolunuza ekleyin, belki $ profilinizde

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

2) boşlukları geri al:

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

0

Yani, benzer bir sorunla karşılaştım ve bunun yerine bu şekilde çözmeyi seçtim:

  1. Alıntı (") karakterlerinizi backtick (`) ile kaçın
  2. Yeni ifadenizi tırnak işaretleri içine alın (")
  3. Çağrı operatörünü (&) kullanarak invoke-expressionyeni dizeye komutu verin

Örnek çözüm:

& {invoke-expression "C: \ Program Files \ IIS \ Microsoft Web Dağıtma \ msdeploy.exe -verb: sync -source: dbfullsql =` "Veri Kaynağı = mysource; Tümleşik Güvenlik = yanlış; Kullanıcı Kimliği = sa; Pwd = sapass !; Veritabanı = mydb; `" -dest: dbfullsql = `" Veri Kaynağı =. \ Mydestsource; Tümleşik Güvenlik = yanlış; Kullanıcı Kimliği = sa; Pwd = sapass!; Veritabanı = mydb; `", bilgisayar adı = 10.10.10.10, kullanıcı adı = yönetici, şifre = adminpass` ""}


0

Yürütülebilir ad için, boşluklarla uğraşmaktan veya yürütülebilir dosyayı $ PATH ortamına eklemeye gerek duymamak için yeni takma ad cmdlet'i kullanılabilir.

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

PS takma adlarını listelemek veya değiştirmek için ayrıca bkz.

PS> get-alias
PS> set-alias

Gönderen Jeffery Hicks Aarticle

Diğer cevaplar argümanları ele alıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.