공백과 따옴표가있는 매개 변수를 사용하여 PowerShell에서 EXE 파일을 실행하는 방법


333

PowerShell에서 다음 명령을 어떻게 실행합니까?

C : \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb : sync -source : dbfullsql = "Data Source = mysource; Integrated Security = false; 사용자 ID = sa; Pwd = sapass!; Database = mydb;" -dest : dbfullsql = "데이터 소스 =. \ mydestsource; 통합 보안 = 거짓; 사용자 ID = sa; Pwd = sapass!; Database = mydb;", computername = 10.10.10.10, username = administrator, password = adminpass "



"기존 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

"mini-markdown"을 사용하여 위의 주석을 편집하여 각 코드 행을 별도의 줄에 표시하고 원래 주석 편집에 5 분의 시간 제한이 만료되는 방법을 모르겠습니다. 누군가가 문제를 해결하기 위해 "미니 마크 다운"을 사용하는 것을 알고 있다면 더 읽기 쉬운 형태로 다시 게시 할 것입니다. 첫 번째 줄은 다음과 같아야합니다. # npm-check-updates 도구를 사용하여 전 세계적으로 설치된 npm 패키지에 사용 가능한 모든 업데이트 표시
user3785010

답변:


347

PowerShell은 문자열로 시작하는 명령을 볼 때 문자열을 평가합니다. 즉, 일반적으로 다음과 같이 화면에 에코합니다.

PS> "Hello World"
Hello World

PowerShell이 ​​문자열을 명령 이름으로 해석하도록하려면 다음과 같이 호출 연산자 (&)를 사용하십시오.

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

그 후에 공백이나 인용 부호가 포함 된 매개 변수 / 인수 쌍만 인용하면됩니다. 복잡한 명령 줄 인수를 사용하여 이와 같은 EXE 파일을 호출 할 때 PowerShell에서 인수를 EXE 파일로 보내는 방법을 보여주는 도구를 사용하는 것이 일반적으로 매우 유용합니다. PowerShell을 커뮤니티 확장은 이러한 도구가 있습니다. 이를 echoargs라고합니다. 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 구문 분석 모드 이해"를 참조하십시오.

2012 년 4 월 4 일 업데이트 :이 상황은 PowerShell V3에서 훨씬 쉽게 처리 할 수 ​​있습니다. 자세한 내용은이 블로그 게시물을 참조하십시오 .


1
두 번째 예제로 사용하는 경우 다음 오류가 발생합니다. 오류 : 인식 할 수없는 인수 ' "-source : dbfullsql =" ""Data'입니다. 모든 인수는 "-"로 시작해야합니다.
Vans

2
죄송하지만 이해가되지 않습니다. 나는 현재 6 명이 답을 찬성하여 명확한 것을 놓치고 있지만 실제 답은 무엇입니까? PowerShell을 사용하여 공백이있는 매개 변수에 대해 알아야 할 특별한 규칙이 있습니까? 아니면 EchoArgs를 사용하여 사례별로 가져 오라고 제안하십니까?
Tyler Collier

인수를 인용하는 것만으로도 충분하지만 항상 그런 것은 아닙니다. 작동하지 않는 경우를 사용 echoargs하면 PowerShell이 ​​인수를 EXE로 전달하기 전에 인수를 해석하는 방법을 나타냅니다.
Keith Hill

1
.bat 파일에서이 작업을 수행하는 방법을 알고 있습니까? & 'C:\Program Files\Sublime Text 3\sublime_text.exe'콘솔에서 직접 시도 하고 있으며 작동하지만 배치 파일에서 '이 시점에서 예상치 못한 &&'라는 오류가 발생합니다.
Joe Zim

신경 쓰지 마. 그것을 발견 :START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
조 ZIM에게

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

기본적으로 Akira의 답변과 동일하지만 명령 매개 변수를 동적으로 작성하고 변수에 넣는 경우 작동합니다.


2
이호 최고입니다! base64, 이상한-% 구문, 대체를 전환하는 토글, 일반적인 powershell 대체 규칙, 혼동 없음, 매우 읽기 쉬운.
AnneTheAgile

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

Microsoft는이 방법을 더 간단하고 명령 프롬프트 구문과 호환해야합니다.


2
배열은 확실히 최선의 선택입니다. 인수가 동적이기 때문에 배열 변수를 전달한 것을 제외하고. 감사.
Jon Barker

IMHO 최고의 솔루션
Vasin Yuriy

25

이를 수행하는 데 사용할 수있는 몇 가지 방법이 있습니다.

호출 연산자 ( & ), Invoke-Expression cmdlet 등을 사용하는 것과 같은 다른 방법이 있지만 안전하지 않은 것으로 간주됩니다. 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"

이 방법은 매개 변수를 한 번에 입력 할 수 있으므로 더 쉽습니다.

powershell에서 따옴표 ( ")를 문자열 로 나타내려면 억음 악센트 (`)를 삽입해야 합니다 (미국 키보드의 Tab 키 위에있는 키임).

-NoNewWindow 매개 변수는 현재 콘솔 창에 새 프로세스를 표시하는 데 사용됩니다. 기본적으로 Windows PowerShell은 새 창을 엽니 다.

참고 자료 : Powershell / Scripting / Start-Process


항상 간단한 승리! 감사.
Mike Casas 2016 년

따옴표를 이스케이프 처리하는 마지막 메모에 감사드립니다!
Paolo


13

누군가가 실행 파일을 실행하는 방법을 궁금해하는 경우 :

.....>. \ file.exe

또는

......> full \ path \ to \ file.exe


2
이 질문에 대한 답이되어야합니다. "PowerShell에서 EXE 시작"키워드로 검색 할 때 찾고 있습니다. 감사합니다 !
Jean-Daniel Gasser 2016 년

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 연결 문자열을 작성할 때 대체 키 이름을 사용하십시오. 예를 들어 "User Id"대신 "UID", "Data Source"대신 "Server", "Integrated Security"대신 "Trusted_Connection"등을 사용하십시오. 연결 문자열에서 모든 공백을 제거한 후에 만 ​​작동시킬 수있었습니다.

명령 줄 끝에 "computername"부분을 추가하지 않았지만이 정보가이 정보를 읽는 다른 사람들이 원하는 결과에 더 가까이 다가 가기를 바랍니다.


2
나는 다른 모든 대답을 시도했지만 이것이 나를 위해 일한 유일한 대답이었습니다! 이 대체 경로를 제공해 주셔서 감사합니다.
Sentient

6

새로운 V3 언어 기능 에서 인용 한 PowerShell 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"""

핵심은 전체 명령이 외부 인용 부호로 묶여 있고 "&"앰퍼샌드가 다른 하위 명령 파일이 실행되도록 지정한 다음 경로 / 파일 이름 주위에 공백으로 이스케이프 처리 된 (더블-더블-) 인용하는 것 같습니다. 당신은 처음부터 실행하고 싶었습니다.

또한 -File이 0이 아닌 리턴 코드를 패스 백하지 않고 -Command가 유일한 대안이라는 MS 연결 문제에 대한 유일한 해결 방법입니다. 그러나 지금까지는 -Command의 한계는 공백을 지원하지 않는 것으로 생각되었습니다. 그 의견 항목도 업데이트했습니다.

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


1
이것은 ops 질문과 관련이 없으며 powershell의 게시물에서 긴 명령을 실행하는 방법을 구체적으로 묻습니다. 파일 경로에 공백이있는 powershell 스크립트를 실행하는 방법이 아닙니다.
leinad13

질문의 제목을 읽으십시오. 공백은 길이가 아닙니다. 이것은 공유 할만한 가치가있는 그러한 문제에 대한 하나의 유효한 답변입니다. 같은 문제가 있고 실제로 시도해 보셨습니까? 개선하고 싶다면 질문에 실제 명령이 포함 된 수정 사항을 제출하십시오.
Tony Wall

3

다른 대답은 Base64로 인코딩 된 명령 스위치 를 사용하는 것입니다 .

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

디코딩하면 모든 인수와 큰 따옴표가 보존 된 OP의 원본 스 니펫임을 알 수 있습니다.

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

powershell 다른 방법으로 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 (가상 상자 가상 시스템을 관리하는 도구)를 사용하면 따옴표없이 문자열 외부에서 매개 변수를 호출해야합니다.

> $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 cmdlet 및 Silent 매개 변수 / S를 사용하여 압축을 풀 수도 있습니다 (압축 된 폴더와 동일한 폴더에 자동 압축 풀림).

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

따라서 powershell에서 인수와 함께 .exe 파일을 실행하는 몇 가지 방법이 있습니다.

때로는 제대로 작동하려면 해결 방법을 찾아야합니다. .exe가 컴파일되었거나 제작자에 의해 만들어진 방식에 따라 추가 노력과 고통이 필요할 수 있습니다.


1

이 간단하고 깨끗하며 효과적인 방법을 사용합니다.

배열 당 인수를 한 줄에 하나씩 배치합니다. 이런 식으로 읽고 편집하는 것이 매우 쉽습니다. 그런 다음 큰 따옴표 안의 모든 인수를 하나의 단일 매개 변수가있는 함수에 전달하는 간단한 트릭을 사용합니다. 배열을 포함하여 배열을 단일 문자열로 병합 한 다음 PS의 'Invoke-Expression'을 사용하여 실행합니다. 이 지시문은 특히 문자열을 실행 가능한 명령으로 변환하도록 설계되었습니다. 잘 작동합니다 :

                    # 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가 없기 때문에 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를 사용하여 새 문자열 에서 명령 을 실행하십시오.

솔루션 예 :

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


0

실행 파일 이름의 경우 공백을 처리하지 않거나 실행 파일을 $ PATH 환경에 추가하지 않아도되도록 new-alias cmdlet을 사용할 수 있습니다.

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

PS 별칭을 나열하거나 수정하려면 다음을 참조하십시오.

PS> get-alias
PS> set-alias

에서 제프리 힉스 Aarticle

다른 답변은 논쟁을 해결합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.