Cách chạy tệp EXE trong PowerShell với các tham số có dấu cách và dấu ngoặc kép


330

Làm thế nào để bạn chạy lệnh sau trong PowerShell?

C: \ Tệp chương trình \ IIS \ Microsoft Web Triển khai \ msdeploy.exe -verb: sync -source: dbfullsql = "Nguồn dữ liệu = mysource; Bảo mật tích hợp = false; ID người dùng = sa; Pwd = sapass !; Database = mydb;" -dest: dbfullsql = "Nguồn dữ liệu =. \ mydestsource; Tích hợp bảo mật = false; ID người dùng = sa; Pwd = sapass !; Database = mydb;", computername = 10.10.10.10, tên người dùng = quản trị viên, mật khẩu = adminpass "



Nếu bạn có ý nghĩa litteraly "trong PowerShell" (mà tôi giải thích có nghĩa là "bên trong một PowerShell hiện dấu nhắc), sau đó ví dụ sau đây có thể được easilyt adpated để phù hợp với nhu cầu của bạn Thông báo không có nhu cầu để tách các lệnh từ các thông số của nó:. # 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

Tôi không biết làm thế nào để sử dụng "đánh dấu nhỏ" để chỉnh sửa nhận xét trên để làm cho mỗi dòng mã xuất hiện trên một dòng riêng biệt và giới hạn thời gian 5 phút để chỉnh sửa nhận xét ban đầu đã hết hạn. Nếu bây giờ có ai biết sử dụng "mini-Markdown" để khắc phục sự cố, tôi sẽ đăng lại ở dạng dễ đọc hơn. Dòng đầu tiên phải là dòng sau: # Hiển thị mọi bản cập nhật có sẵn cho các gói npm được cài đặt toàn cầu bằng công cụ
npm

Câu trả lời:


345

Khi PowerShell thấy một lệnh bắt đầu bằng một chuỗi, nó chỉ đánh giá chuỗi, nghĩa là, nó thường lặp lại nó trên màn hình, ví dụ:

PS> "Hello World"
Hello World

Nếu bạn muốn PowerShell diễn giải chuỗi dưới dạng tên lệnh thì hãy sử dụng toán tử cuộc gọi (&) như vậy:

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

Sau đó, có lẽ bạn chỉ cần trích dẫn các cặp tham số / đối số có chứa khoảng trắng và / hoặc ký tự trích dẫn. Khi bạn gọi một tệp EXE như thế này với các đối số dòng lệnh phức tạp, thường rất hữu ích khi có một công cụ sẽ cho bạn thấy cách PowerShell gửi các đối số đến tệp EXE. Các PowerShell Cộng đồng Extensions có một công cụ như vậy. Nó được gọi là echoargs. Bạn chỉ cần thay thế tệp EXE bằng echoargs - để lại tất cả các đối số và nó sẽ cho bạn thấy tệp EXE sẽ nhận các đối số như thế nào, ví dụ:

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>

Sử dụng echoargs bạn có thể thử nghiệm cho đến khi bạn hiểu đúng, ví dụ:

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

Hóa ra tôi đã rất cố gắng trước đây để duy trì dấu ngoặc kép xung quanh chuỗi kết nối. Rõ ràng điều đó là không cần thiết bởi vì ngay cả cmd.exe cũng sẽ loại bỏ chúng.

BTW, ngả mũ với đội PowerShell. Chúng khá hữu ích trong việc chỉ cho tôi câu thần chú cụ thể của dấu ngoặc đơn & dấu ngoặc kép để có kết quả mong muốn - nếu bạn cần giữ nguyên dấu ngoặc kép bên trong. :-) Họ cũng nhận ra đây là một lĩnh vực đau đớn, nhưng họ bị thúc đẩy bởi số lượng người bị ảnh hưởng bởi một vấn đề cụ thể. Nếu đây là một lĩnh vực gây đau khổ cho bạn, thì vui lòng bỏ phiếu gửi lỗi PowerShell này .

Để biết thêm thông tin về cách phân tích cú pháp PowerShell, hãy xem loạt blog PowerShell hiệu quả của tôi - cụ thể là mục 10 - "Tìm hiểu các chế độ phân tích cú pháp PowerShell"

CẬP NHẬT 4/4/2012: Tình huống này trở nên dễ xử lý hơn trong PowerShell V3. Xem bài đăng trên blog này để biết chi tiết .


1
nếu sử dụng làm ví dụ thứ hai, tôi gặp lỗi này: Lỗi: Đối số không được nhận dạng '"-source: dbfullsql =" "" Dữ liệu'. Tất cả các đối số phải bắt đầu bằng "-".
Vans

2
Tôi xin lỗi, tôi không hiểu. Tôi thấy rằng, hiện tại, 6 người đã đưa ra câu trả lời vì vậy tôi đang thiếu một cái gì đó rõ ràng, nhưng câu trả lời thực sự là gì? Có một quy tắc đặc biệt nào để biết về các tham số có khoảng trắng với PowerShell không, hoặc bạn chỉ đề nghị sử dụng từng trường hợp cụ thể, sử dụng EchoArss để trợ giúp?
Tyler Collier

Trích dẫn các đối số thường là đủ nhưng không phải luôn luôn. Trong những trường hợp nó không hoạt động, việc sử dụng echoargsđưa ra một dấu hiệu về cách PowerShell diễn giải các đối số trước khi nó chuyển chúng sang EXE.
Keith Hill

1
Bạn có biết làm thế nào tôi sẽ làm điều này trong một tập tin .bat? Tôi đang thử & 'C:\Program Files\Sublime Text 3\sublime_text.exe'trực tiếp trong bảng điều khiển và nó đang hoạt động, nhưng trong một tệp bó tôi gặp lỗi thông báo '& thật bất ngờ vào lúc này'.
Joe Zim

Đừng bận tâm. Tìm thấy nó:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Joe Zim

61

Chỉ cần thêm toán tử & trước tên .exe. Đây là lệnh để cài đặt SQL Server Express ở chế độ im lặng:

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

53

Tôi đã có không gian trong cả hai lệnh và tham số, và đây là những gì làm việc cho tôi:

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

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

Về cơ bản nó giống như câu trả lời của Akira, nhưng điều này hoạt động nếu bạn tự động xây dựng các tham số lệnh của mình và đặt chúng vào một biến.


2
Imho đây là tốt nhất! không có cơ sở64, không có cú pháp lạ -% nào thay đổi quy tắc thay thế, quy tắc thay thế quyền hạn thông thường, không nhầm lẫn, rất dễ đọc.
AnneTheAgile

1
Điều này không hoạt động. Nếu tham số của bạn có tên đường dẫn trong đó, tên đường dẫn sẽ được chia thành nhiều tham số.
BrainSlugs83

1
Câu trả lời tốt đẹp. Tuy nhiên, nó sẽ làm việc với dấu ngoặc kép trong các tham số?
Akira Yamamoto

Hãy thử điều này, sau khi mọi thứ khác thực sự làm việc. Và cũng sử dụng Tiện ích mở rộng PowershellEchoArgs
Jeremy Thompson

34

Điều này làm việc cho tôi:

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

Chỉ cần đặt các đường dẫn hoặc chuỗi kết nối trong một mục mảng và phân chia những thứ khác trong mỗi mục mảng.

Có rất nhiều lựa chọn khác ở đây: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-ricky-executables.aspx

Microsoft nên làm cho cách này đơn giản hơn và tương thích với cú pháp nhắc lệnh.


2
Array chắc chắn là lựa chọn tốt nhất - điều này làm việc rất tốt cho tôi. Ngoại trừ tôi đã truyền một biến mảng vì các đối số của tôi là động. Cảm ơn.
Jon Barker

Giải pháp tốt nhất của IMHO
Vasin Yuriy

24

Có khá nhiều phương pháp bạn có thể sử dụng để làm điều đó.

Có các phương pháp khác như sử dụng Trình điều khiển cuộc gọi ( & ), lệnh ghép ngắn Invoke-Expression, v.v. Nhưng chúng được coi là không an toàn. Microsoft khuyên bạn nên sử dụng Start-Process .

Phương pháp 1

Một ví dụ đơn giản

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

Trong trường hợp của bạn

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"

Trong phương thức này, bạn phân tách từng và mọi tham số trong ArgumentList bằng dấu phẩy.

Cách 2

Ví dụ đơn giản

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

Trong trường hợp của bạn

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"

Phương pháp này dễ dàng hơn vì nó cho phép nhập các tham số của bạn trong một lần.

Lưu ý rằng trong powershell để biểu thị dấu ngoặc kép (") trong một chuỗi, bạn nên chèn dấu trọng âm (`) (Đây là phím phía trên phím Tab trong bàn phím Hoa Kỳ).

-Không tham số NewWindow được sử dụng để hiển thị quy trình mới trong cửa sổ giao diện điều khiển hiện tại. Theo mặc định, Windows PowerShell mở một cửa sổ mới.

Tài liệu tham khảo: Powershell / Scripting / Start-Process


Đơn giản luôn luôn chiến thắng! Cảm ơn.
Mike Casas

Cảm ơn các lưu ý cuối cùng về việc thoát dấu ngoặc kép!
Paolo


13

Trong trường hợp ai đó đang tự hỏi làm thế nào để chỉ chạy một tập tin thực thi:

.....>. \ file.exe

hoặc là

......> đầy đủ \ đường dẫn \ đến \ file.exe


2
Đây sẽ là câu trả lời cho câu hỏi đó, đó là những gì chúng tôi đang tìm kiếm khi chúng tôi tìm kiếm với từ khóa "Bắt đầu EXE từ PowerShell". Cảm ơn bạn !
Jean-Daniel Gasser

2
Làm thế nào về việc chạy với các đối số?
SereneWizard

1
@SereneWizard Vâng, thêm chúng sau .exe với khoảng cách giữa. Ví dụ :. \ File.exe param1 param2 param3
darkgaze

9

Tôi đã có thể làm cho lệnh tương tự của tôi hoạt động bằng cách sử dụng cách tiếp cận sau:

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

Đối với lệnh của bạn (không phải là nó giúp nhiều bây giờ), mọi thứ sẽ trông giống như thế này:

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

Những điểm chính là:

  • Sử dụng dấu ngoặc kép xung quanh đối số nguồn và xóa dấu ngoặc kép được nhúng xung quanh chuỗi kết nối
  • Sử dụng các tên khóa thay thế trong việc xây dựng chuỗi kết nối SQL không có khoảng trắng trong chúng. Ví dụ: sử dụng "UID" thay vì "Id người dùng", "Máy chủ" thay vì "Nguồn dữ liệu", "Trusted_Connection" thay vì "Bảo mật tích hợp", v.v. Tôi chỉ có thể làm cho nó hoạt động khi tôi xóa tất cả các khoảng trắng khỏi chuỗi kết nối.

Tôi đã không thử thêm phần "tên máy tính" vào cuối dòng lệnh, nhưng hy vọng thông tin này sẽ giúp những người khác đọc nó gần hơn với kết quả mong muốn của họ.


2
Tôi đã thử tất cả các câu trả lời khác, nhưng đây là câu trả lời duy nhất phù hợp với tôi! Cảm ơn đã cung cấp con đường thay thế này.
Sentient

6

Chuỗi thoát mới trong PowerShell V3, được trích dẫn từ Các tính năng ngôn ngữ V3 mới :

Tái sử dụng các dòng lệnh dễ dàng hơn từ Cmd.exe

Web có đầy đủ các dòng lệnh được viết cho Cmd.exe. Các dòng lệnh này thường hoạt động đủ trong PowerShell, nhưng khi chúng bao gồm một số ký tự nhất định, ví dụ: dấu chấm phẩy (;), ký hiệu đô la ($) hoặc dấu ngoặc nhọn, bạn phải thực hiện một số thay đổi, có thể thêm một số trích dẫn. Đây dường như là nguồn gốc của nhiều cơn đau đầu nhỏ.

Để giúp giải quyết tình huống này, chúng tôi đã thêm một cách mới để Thoát khỏi việc phân tích cú pháp các dòng lệnh. Nếu bạn sử dụng tham số ma thuật -%, chúng tôi sẽ dừng phân tích cú pháp thông thường của dòng lệnh của bạn và chuyển sang một thứ đơn giản hơn nhiều. Chúng tôi không khớp dấu ngoặc kép. Chúng tôi không dừng lại ở dấu chấm phẩy. Chúng tôi không mở rộng các biến PowerShell. Chúng tôi mở rộng các biến môi trường nếu bạn sử dụng cú pháp Cmd.exe (ví dụ% TEMP%). Ngoài ra, các đối số cho đến cuối dòng (hoặc đường ống, nếu bạn đang đường ống) được truyền như vậy. Đây là một ví dụ:

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

6

Bạn có thể dùng:

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"

Điều quan trọng cần lưu ý ở đây là FilePath phải ở vị trí 0, theo Hướng dẫn trợ giúp. Để gọi hướng dẫn trợ giúp cho một lệnh, chỉ cần nhập Get-Help <Commandlet-name> -Detailed. Trong trường hợp này, nó là Get-Help Start-Process -Detailed.


Điều này làm việc cho tôi khi &không
Kolob Canyon

5

Tôi đã thử tất cả các đề xuất nhưng vẫn không thể chạy msiexec.exevới các tham số có khoảng trắng. Vì vậy, giải pháp của tôi đã kết thúc bằng cách sử dụng 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

Điều này làm việc cho tôi:

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

Chìa khóa dường như là toàn bộ lệnh được đặt trong dấu ngoặc kép bên ngoài, dấu "&" được sử dụng để chỉ định một tệp lệnh con khác đang được thực thi, sau đó cuối cùng thoát khỏi dấu ngoặc kép (double-double-) xung quanh tên đường dẫn / tệp có khoảng trắng trong bạn muốn thực hiện ở nơi đầu tiên.

Điều này cũng hoàn thành cách giải quyết duy nhất cho vấn đề kết nối MS mà -File không trả lại mã trả về không bằng 0 và -Command là giải pháp thay thế duy nhất. Nhưng cho đến bây giờ người ta nghĩ rằng một hạn chế của -Command là nó không hỗ trợ không gian. Tôi cũng đã cập nhật mục phản hồi đó.

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-c chính-exit-codes-whoen-use-the-file-opt


1
Điều này không liên quan đến câu hỏi của ops, anh đặc biệt hỏi làm thế nào để chạy lệnh dài trong bài viết của mình trong powershell. Không phải làm thế nào để chạy một tập lệnh powershell với khoảng trắng trong đường dẫn tệp.
leinad13

Đọc tiêu đề của câu hỏi, không gian là vấn đề không dài. Đây là một câu trả lời hợp lệ cho các vấn đề như vậy để chia sẻ đáng giá. Bạn có cùng một vấn đề và thực sự thử nó? Nếu bạn muốn cải thiện nó, hãy gửi một bản chỉnh sửa bao gồm lệnh thực tế trong câu hỏi và tôi sẽ chấp nhận nó.
Tony Wall

3

Một câu trả lời khác là sử dụng công tắc lệnh được mã hóa Base64 :

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Khi được giải mã, bạn sẽ thấy đó là đoạn gốc của OP với tất cả các đối số và dấu ngoặc kép được giữ nguyên.

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.

Lệnh ban đầu:

 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"

Nó biến thành cái này khi được mã hóa thành Base64:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

và đây là cách nhân rộng tại nhà:

$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

Bạn có thể chạy các tệp exe theo các cách khác nhau. Chẳng hạn, nếu bạn muốn chạy unrar.exe và giải nén tệp .rar, bạn có thể chỉ cần viết vào powershell này:

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

Nhưng đôi khi, điều này không hoạt động nên bạn phải sử dụng tham số & như được hiển thị ở trên: Ví dụ, với vboxmanage.exe (một công cụ để quản lý các máy ảo hộp ảo), bạn phải gọi các tham số bên ngoài chuỗi như thế này, không có dấu ngoặc kép:

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

Nếu bạn muốn gọi đơn giản là một tệp lưu trữ winrar dưới dạng tệp .exe, bạn cũng có thể giải nén nó bằng lệnh ghép lệnh invoke và tham số Im lặng / Nó sẽ tự giải nén trong cùng một thư mục so với nơi nó đã được nén).

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

Vì vậy, có một số cách để chạy các tệp .exe với các đối số trong powershell.

Đôi khi, người ta phải tìm một cách giải quyết để làm cho nó hoạt động chính xác, điều này có thể đòi hỏi một số nỗ lực và đau đớn hơn nữa :) tùy thuộc vào cách .exe đã được biên dịch hoặc tạo ra người tạo ra nó.


1

Tôi sử dụng phương pháp đơn giản, sạch sẽ và hiệu quả này.

Tôi đặt các đối số trong một mảng, 1 trên mỗi dòng. Cách này rất dễ đọc và chỉnh sửa. Sau đó, tôi sử dụng một mẹo đơn giản là chuyển tất cả các đối số bên trong dấu ngoặc kép sang một hàm với 1 tham số duy nhất. Điều đó làm phẳng chúng, bao gồm các mảng, thành một chuỗi, sau đó tôi thực thi bằng cách sử dụng 'Invoke-Expression' của PS. Lệnh này được thiết kế đặc biệt để chuyển đổi một chuỗi thành lệnh runnable. Hoạt động tốt:

                    # 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

Tôi đã có đoạn mã sau hoạt động hoàn hảo trên máy tính xách tay của mình:

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

Sau đó, khi tôi cố chạy nó trực tiếp trên một máy chủ, tôi bắt đầu gặp những lỗi đó "Unrecognized argument ...etc.... All arguments must begin with "-". "

Sau khi thử tất cả các cách giải quyết có thể (không thành công), tôi phát hiện ra rằng Powershell trên máy chủ (Windows 2008 R2) là phiên bản 3.0, trong khi máy tính xách tay của tôi có 5.0. (bạn có thể sử dụng "$ PSVersionTable" để xem phiên bản).

Sau khi nâng cấp Powershell lên phiên bản mới nhất, nó bắt đầu hoạt động trở lại.


1

Cmd có thể xử lý việc chạy exe được trích dẫn, nhưng Powershell thì không. Tôi sẽ đối phó với việc chạy exe, vì tôi không có nó. Nếu bạn thực sự cần phải gửi doublequote đến một đối số của lệnh bên ngoài, thì đó là một vấn đề khác được đề cập ở nơi khác.

1) thêm thư mục exe vào đường dẫn của bạn, có thể trong hồ sơ $ của bạn

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

2) backquote các khoảng trắng:

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

0

Vì vậy, tôi gặp phải một vấn đề tương tự và chọn cách giải quyết theo cách này:

  1. Thoát ký tự trích dẫn (") của bạn bằng backtick (`)
  2. Bao quanh biểu thức mới của bạn bằng dấu ngoặc kép (")
  3. Sử dụng toán tử cuộc gọi (&), ban hành lệnh invoke-expressiontrên chuỗi mới

Giải pháp ví dụ:

& {invoke-express "C: \ Program Files \ IIS \ Microsoft Web Deployment \ msdeploy.exe -verb: sync -source: dbfullsql =` "Data Source = mysource; Integration Security = false; ID người dùng = sa; Pwd = sapass ! tên người dùng = quản trị viên, mật khẩu = adminpass` ""}


0

Đối với tên thực thi, cmdlet bí danh mới có thể được sử dụng để tránh xử lý các khoảng trắng hoặc cần thêm tệp thực thi vào môi trường $ PATH.

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

Để liệt kê hoặc sửa đổi bí danh PS cũng xem

PS> get-alias
PS> set-alias

Từ Jeffery Hicks Aarticle

Các câu trả lời khác giải quyết các đối số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.