programing

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

stoneblock 2023. 4. 14. 21:05

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

PowerShell에서 다음 명령을 실행하려면 어떻게 해야 합니까?

C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe - verb:sync - source:dbfullsql="Data Source=mysource;통합보안=false;사용자 ID=sa;Pwd=userass!;Database=mydb;" -dest:dbfullsql="Data Source=".\mydest source;통합보안=false;사용자 ID=sa;Pwd=userass!;데이터베이스=mydb;", computername=10.10.10, 사용자명=관리자, 비밀번호=adminpass"

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>

에코아그를 사용하면 다음과 같이 올바른 결과를 얻을 때까지 실험을 할 수 있습니다.

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가 그것들을 제거합니다.

그나저나, PowerShell 팀에게 경의를 표합니다.그들은 원하는 결과를 얻기 위해 작은 따옴표와 큰 따옴표를 사용하는 구체적인 주문을 보여주는데 큰 도움이 되었습니다.내부 큰따옴표를 사용할 필요가 있는 경우:-) 그들은 또한 이것이 고통의 영역이라는 것을 알고 있지만, 그들은 특정 문제에 영향을 받는 사람들의 수에 따라 움직이고 있습니다.이 문제가 있는 경우 이 PowerShell 버그 제출에 투표해 주십시오.

PowerShell 구문 분석 방법에 대한 자세한 내용은 효과적인 PowerShell 블로그 시리즈, 특히 항목 10 - "PowerShell 구문 분석 모드 이해"를 참조하십시오.

2012년 4월 4일 업데이트:PowerShell V3에서는 이 상황을 훨씬 쉽게 처리할 수 있습니다.상세한 것에 대하여는, 이 블로그의 투고를 참조해 주세요.

명령어와 파라미터에 공백이 있어서 다음과 같이 조작할 수 있었습니다.

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

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

기본적으로는 Akira의 답변과 동일하지만 명령 파라미터를 동적으로 작성하여 변수에 넣으면 효과가 있습니다.

.exe 이름 앞에 & 연산자를 추가합니다.다음은 SQL Server Express를 사일런트모드로 설치하는 명령어입니다.

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

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

당신이 그것을 하기 위해 사용할 수 있는 방법은 꽤 있다.

콜 오퍼레이터(&), Invoke-Expression cmdlet 등의 다른 방법이 있습니다.하지만 그것들은 안전하지 않은 것으로 여겨진다.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"

이 방법은 파라미터를 한 번에 입력할 수 있기 때문에 더 쉽습니다.

문자열에 따옴표(" )를 나타내는 powershell에는 굵은 액센트(')를 삽입해야 합니다(이것은 US 키보드의 Tab 키 위에 있는 키입니다).

-No New Window 파라미터는 현재 콘솔창에 새로운 프로세스를 표시하는 데 사용됩니다.기본적으로는 Windows PowerShell에서 새 창이 열립니다.

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

이 방법은 효과가 있었습니다.

& '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 에서는, 이 방법을 간단하게 해, 커맨드 프롬프트 구문과의 호환성을 확보할 필요가 있습니다.

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

..... > .\ 파일.실행

또는

......> full\path\to\file.실행

다음 페이지를 참조하십시오.https://slai.github.io/posts/powershell-and-external-commands-done-right/

vshadow를 외부 실행 파일로 사용한 요약:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:

다음을 사용할 수 있습니다.

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.

다음과 같은 방법으로 유사한 명령어를 사용할 수 있었습니다.

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

요점은 다음과 같습니다.

  • source 인수 주위에 따옴표를 사용하고 연결 문자열 주위에 포함된 따옴표를 제거합니다.
  • 공백이 없는 SQL 연결 문자열을 작성할 때 대체 키 이름을 사용합니다.예를 들어 "User Id" 대신 "UID", "Data Source" 대신 "Server", "Integrated Security" 대신 "Trusted_Connection" 등을 사용합니다.연결 문자열에서 모든 공백을 제거한 후에만 작동시킬 수 있었습니다.

명령줄 끝에 "computername" 부분을 추가해 보지는 않았지만, 이 정보를 통해 다른 사용자가 원하는 결과에 근접할 수 있기를 바랍니다.

PowerShell V3의 새로운 이스케이프 문자열은 새로운 V3 언어 기능에서 인용되었습니다.

Cmd.exe 명령줄 재사용 용이성

웹은 Cmd.exe용으로 작성된 명령줄로 가득합니다.이러한 명령어 행은 PowerShell에서 충분히 자주 작동하지만 세미콜론(;), 달러 기호($) 또는 물결 괄호와 같은 특정 문자를 포함하는 경우에는 일부 변경 사항을 수행해야 합니다. 예를 들어 따옴표를 추가해야 합니다.이것이 많은 사소한 두통의 원인인 것 같았다.

이 시나리오에 대처하기 위해 명령줄의 해석을 "회피"하는 새로운 방법을 추가했습니다.magic 파라미터를 사용하는 경우 --% 명령줄을 정상적으로 해석하지 않고 보다 간단한 것으로 전환합니다.우린 따옴표가 안 맞아세미콜론에 그치지 않습니다.PowerShell 변수는 확장하지 않습니다.Cmd.exe 구문(예: %TEMP%)을 사용하는 경우 환경 변수를 확장합니다.그 이외의 인수는 회선의 끝(파이프인 경우 파이프)까지 그대로 전달됩니다.다음은 예를 제시하겠습니다.

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

나는 이 간단하고, 깨끗하고, 효과적인 방법을 사용한다.

한 줄에 하나씩 배열에 인수를 배치합니다.이렇게 하면 읽고 편집하기가 매우 쉽습니다.그런 다음 큰따옴표 안에 있는 모든 인수를 단일 매개 변수가 있는 함수에 전달하는 간단한 방법을 사용합니다.그러면 어레이를 포함하여 하나의 문자열로 압축되어 PS의 'Invoke-Expression'을 사용하여 실행됩니다.이 디렉티브는 문자열을 runnable 명령어로 변환하도록 특별히 설계되었습니다.정상적으로 동작:

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

.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
$stdout = $p.StandardOutput.ReadToEnd()
$p.WaitForExit()

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의 작성 방법이나 작성 방법에 따라서는 좀 더 많은 노력과 노력이 필요할 수 있습니다. :)

Cmd는 따옴표로 묶인 exe 실행을 처리할 수 있지만 Powershell은 처리할 수 없습니다.exe 실행 자체는 가지고 있지 않기 때문에 처리하겠습니다.외부 명령어 인수에 말 그대로 이중 따옴표를 보내야 하는 경우, 이는 다른 곳에서 다루어진 문제입니다.

1) 경로에 exe 폴더를 추가합니다($profile 내).

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

2) 스페이스를 백쿼트 합니다.

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

이 방법은 효과가 있었습니다.

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

중요한 것은 명령어 전체가 외부 따옴표로 둘러싸여 있고 "&" 앰퍼샌드가 다른 하위 명령어파일이 실행 중임을 지정하는 데 사용되며, 마지막으로 경로/파일 이름 주위에 공백이 있는 이스케이프(더블-더블-더블-) 따옴표가 사용됩니다.

또한 MS 접속 문제에 대한 유일한 회피책으로 -File은 제로 이외의 리턴 코드를 반환하지 않으며 -Command만이 유일한 대안입니다.그러나 지금까지 -Command의 한계는 공간을 지원하지 않는다는 것이었습니다.저는 그 피드백 항목도 업데이트했습니다.

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

대체 응답은 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

실행 파일 이름에는 공백 처리나 $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

Jeffery Hicks Aarticle에서

다른 답변은 인수를 다룹니다.

현재 디렉토리에서 파일을 실행해야 하고 경로 전체를 입력할 필요가 없는 경우 Get-Location을 사용합니다.

& "$(Get-Location)\example.exe" arg1 arg2 arg3

해 주세요.&처음에.따옴표 뒤에 공백인 인수가 배치됩니다.

노트북에서는 다음 코드가 완벽하게 작동하고 있었습니다.

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

후, 에서 직접 , 「」, 「1」, 「1」이 표시되기 시작했습니다."Unrecognized argument ...etc.... All arguments must begin with "-". "

가능한 모든 회피책(실패하지 않음)을 시험한 결과, 서버의 Powershell(Windows 2008 R2)이 버전 3.0인 것을 알 수 있었습니다.노트북은 5.0입니다.('$PSversionTable'을 사용하여 버전을 확인할 수 있습니다.)

Powershell을 최신 버전으로 업그레이드한 후 다시 작동하기 시작했습니다.

그래서 저는 비슷한 문제에 부딪혔고 대신 이렇게 해결하기로 했습니다.

  1. 따옴표(") 문자는 백체크(')로 이스케이프합니다.
  2. 새 표현식을 따옴표(")로 둘러싸십시오.
  3. 오퍼레이터를 「」를 합니다.invoke-expression

솔루션 예시:

& { 호출 표현식 "C:\Program Files\IIS \ Microsoft Web Deploy \ msdeploy . exe - verb : sync - source : dbfullsql = ' " Data Source = my source ;통합보안=false;사용자 ID=sa;Pwd=userass!;Database=mydb;' -dest:dbfullsql='"Data Source=".\mydest source;통합보안=false;사용자 ID=sa;Pwd=userass!;Database=mydb;', computername=10.10.10, username=computerator, password=adminpass'"}

exiftool을 사용하여 배치 스크립트를 전송하려면powershell 스크립트에 대해 명령어에 '-s', '-s', '-s', 심지어 ${Filename}을(를) 부여하고 다른 한편으로 이들 파라미터에 변수를 입력합니다.

우선:'에코차'를 대체한 것은 훌륭하다.어떤 파라미터가 단일 파라미터로 그룹화되어 있고 어떤 파라미터가 다음 파라미터로 분류되어 있는지 명확하게 알 수 있습니다.

powershell에서는 perl(및 unix 스크립팅)과 비슷합니다.사용되는 따옴표에는 그 의미가 있습니다.

  • "-s" 사이의 문자열입니다.문자열이 해석됩니다(변수 입력).
  • ~ 사이의 문자열.문자열은 해석되지 않습니다(또는 verry limited).
  • 이스케이프 문자는 (뒷면)입니다.다음 글자는 특별한 의미를 잃는다.unix/linux/perl의 \(백 스트로크)와 동등합니다.

몇 가지 예:

${ExifArgs} += "-if `"`${FileName} !~ /desktop.ini/i`""
${ExifArgs} += '-dateFormat "%Y\%Y%m\%Y%m%d_%H%M%S"'
${ExifArgs} += ('"' + "-FileName<${NewFotos}\${SourceName}\" + '${DateTimeOriginal}_${ImageWidth}x${ImageHeight}_${Model;s/ //g}_${FileName;s/^.*([0-9]{4})[^0-9].*$/\1/}.%e' + '"')

상기의 에코아그에 콜하면 다음 출력이 생성됩니다(번호는 프라이버시를 위해 해킹됩니다).

Arg 11 is <-if>
Arg 12 is <${FileName} !~ /desktop.ini/i>
Arg 13 is <-dateFormat>
Arg 14 is <%Y\%Y%m\%Y%m%d_%H%M%S>
Arg 15 is <-FileName<D:\Pictures\NewFotos\${DateTimeOriginal}_${ImageWidth}x${ImageHeight}_${Model;s/ //g}_${FileName;s/^.*([0-9]{4})[^0-9].*$/\1/}.%e>

첫 번째 행이 arg 11과 12를 생성하는 방법을 참조하십시오. "-s"를 삭제하여 전체 행을 배열에 저장합니다.-s로 따옴표로 묶은 내부 "-s"는 인수를 함께 유지하기 위해 사용됩니다(반면 -if는 이전 인수임).

두 번째는 arg 13과 14를 나타내고 있습니다.-s 사이에 "-s"를 사용하는 것입니다.'-s'를 사용하여 탈출할 필요가 없습니다.

마지막 행(생성 arg 15): powershell ()-s 및 +-s를 사용하여 한 쌍의 문자열을 하나의 문자열에 연결함으로써 단일 문자열을 구성한다.som{}-s는 powershell로, 일부는 expressool로 입력하기 위해 "와 "로 구분된 문자열을 사용합니다.그리고 네, 몇몇 파워셸 특수 캐릭터들은 아큐먼트 안으로 옮겨집니다.

언급URL : https://stackoverflow.com/questions/1673967/how-to-run-an-exe-file-in-powershell-with-parameters-with-spaces-and-quotes