programing

매개 변수에 공백이 있을 때 파워셸에서 msdeploy를 어떻게 부르나요?

skycolor 2023. 9. 24. 12:43
반응형

매개 변수에 공백이 있을 때 파워셸에서 msdeploy를 어떻게 부르나요?

powershell 스크립트에서 msdeploy로 보내려고 하는 매개 변수의 공백 문제가 발생했습니다.

그 외에도 관련 기사들이 많이 있지만 그 중에 문제를 해결하는 기사는 없습니다.
PowerShell 및 MS Deploy 를 사용하는 문제.
작동하지 않는 유사한 SO 문제:공백 및 따옴표가 있는 매개 변수로 powershell에서 exe를 실행하는 방법
PowerShell BUG:합니다 합니다.
작동하지 않는 또 다른 SO 문제:PowerShell 2.0에서 매개 변수 전달

더 복잡하게 만들 때 성공했다가 실패하는 가장 간단한 예는 기본 웹 사이트를 버리는 것입니다.

msdeploy "C:\Program Files\"IIS\Microsoft Web Deploy\msdeploy.exe"
ms - - 웹 - ose &$ms - 동사: 덤프 - : appHostConfig '' - 동사
SUCCESS

이것 말이에요?

웹 $sitname""
ms - - - ose &$ms - 동사: 덤프 - : appHostConfig $sitname - verbose
와 함께 합니다.
msdeploy.msdeploy.exe: : 할 수 없는 인수 '-source:"appHostConfig=default" 를 인식할 수 없습니다.로 . "다"를는합니다.
C:\xxx\test.ps1:122 char:6
+ &
범주 +리Info : 되지 않음정보: 지정되지 않음: (오류:인식할 수 없음 시작합니다: 문자열)[],"
Qualified ErrorId : Native Error + Full Qualified ErrorId : Native Command Error
1 : 1.

도 했습니다에 했습니다.
#FAIL
웹 $sitname''
웹 $sitname''''''
웹 $sitname""""
웹 $sitname""
웹 $sitname''

ms - - ose &$ms - 동사: 덤프 "-source: appHostConfig$sitname" - 장황한 내용
ms - - - ose &$ms - 동사: 덤프 - : appHostConfig"$sitename" - 자세한 내용
ms - - - ose &$ms - 동사: 덤프 - : appHostConfig '$sitname' - 장황한 내용
배포 - - - ose &$ms - 동사: 덤프 - : appHostConfig '$sitname' - 동사
배포 - - - ose &$ms - 동사: 덤프 - : appHostConfig'$sitename' - 동사: 자세한 내용

난 어쩔 줄 모르겠다.같이 일하는 모든 사람들이 막막해요.이건 정말 형편없어요.파워셸이 너무 좋았어요.ms 전개가 너무 좋았어요.저는 그것들을 합치는 것을 좋아한다고 말할 수 없습니다.cli 대신 API에 초점을 맞추는 것이 더 쉬웠을 것 같습니다.

편집:

황제 XLII가 제시한 문자열 배열의 매개 변수는 잘 작동합니다.대체 솔루션은 다음 기사에 나와 있습니다.PowerShell과 함께 MSDeploy를 사용하는 데 따른 시행착오

function PushToTarget([string]$server, [string]$remotePath, [string]$localPath) {
    cmd.exe /C $("msdeploy.exe -verb:sync -source:contentPath=`"{0}`" -dest:computerName=`"{1}`",contentPath=`"{2}`" -whatif" -f $localPath, $server, $remotePath )
}

Keith의 답변에 대한 기술을 사용하여 공간과 인용문이 있는 매개 변수로 파워셸에서 실행하는 방법, 실행echoargs -verb:dump -source:appHostConfig=$sitename -verbose다음 결과를 제공했습니다.

Arg 0 is <-verb:dump>
Arg 1 is <-source:appHostConfig=default>
Arg 2 is <web>
Arg 3 is <site>
Arg 4 is <-verbose>

입니다의 됩니다.appHostConfig=defaulttmsdeploy보고 있었습니다.

중인 입니다.echoargs -verb:dump "-source:appHostConfig=$sitename" -verbose,와 함께$sitename = "default web site"를(를) 하는 것으로 .

Arg 0 is <-verb:dump>
Arg 1 is <-source:appHostConfig=default web site>
Arg 2 is <-verbose> 

당신의 목록을 보면 이것은 당신에게 효과가 없었던 것 같습니다.

다른 방법은 배열에서 인수 목록을 작성하는 것인데, 이는 파워셸이 자동으로 빠져나올 수 있습니다.예를 들어 위와 같은 출력을 제공합니다.

[string[]]$msdeployArgs = @(
  "-verb:dump",
  "-source:appHostConfig=$sitename",
  "-verbose"
)
echoargs $msdeployArgs

누구에게나 도움이 될 경우를 대비해 다른 방법을 추가하는 것입니다.

Invoke-Expression "& '[path to msdeploy]\msdeploy.exe' --% -verb:sync -source:contentPath=`'$source`' -dest:contentPath=`'$dest`'"

"--%" 파워셸 3은 처음입니다여기서부터는 "명령줄의 어느 곳에나 --% 시퀀스(대시 2개와 퍼센트 기호)를 추가하면 PowerShell은 해당 라인의 나머지 부분을 구문 분석하지 않습니다."

효과적인 해결책과 쉬운 해결책을 찾았습니다.참조: http://answered.site/all-arguments-must-begin-win--at-cwindowdload webservice published website service deployments123/4231580/

$msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe"
$msdeployArgs = @(
"-verb:sync",
"-source:iisApp='Default Web Site/HelloWorld'",
"-verbose",
"-dest:archiveDir='c:\temp1'"
)
Start-Process $msdeploy -NoNewWindow -ArgumentList $msdeployArgs

우리는 비슷한 종류의 문제에 직면했습니다.우리의 해결책은 아래와 같습니다.

$path = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe";

$verb = "-verb:sync";

$src = "-source:contentPath=[ESC][ESC][ESC]"c:\aa aa[ESC][ESC][ESC]";

$dest = "-dest:contentPath=[ESC][ESC][ESC]"c:\aa[ESC][ESC][ESC]";

Invoke-Expression "&'$path' $verb $src $dest"; 

여기서 - is 이스케이프 시퀀스/문자

저는 태양 아래에서 모든 기술을 시도해 보았고, 이것이 유일하게 (PowerShell 2를 사용하는) 저에게 효과적이었습니다.

cmd.exe /C $("msdeploy.exe -verb:sync -source:package=`"{0}`" -dest:auto,IncludeAcls=`"False`" -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -setParamFile:`"{1}`"" -f $mypackagepath, $myparamfilepath )

아래의 입력에서 도출된 또 다른 접근 방식이 있습니다.

$msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe";

$command = "-verb:sync";

$sourcePath = "C:\aa aa\";
$source = $("-source:contentPath=`"{0}`"" -f $sourcePath);

$destPath = "C:\aa"
$destination = $("-dest:contentPath=`"{0}`" -f $destPath);

$msdeploycommand = $("`"{0}`" {1} {2} {3} -verbose" -f $msdeploy, $command, $source, $destination);

cmd.exe /C "`"$msdeploycommand`"";

이것은 MSDeploy를 위한 것입니다.공간이 포함된 기본 설치 폴더에 있습니다.따라서 탈출 캐릭터(')로 래핑합니다.

위의 답변에서 나온 몇 가지 아이디어를 사용하여 다음과 같은 간단한 기능을 생각해 냈습니다.

빌드 에이전트에서 실행할 때 때로는 PATH to msDeploy를 인식하지 못하므로 MSDeploy에 전체 경로를 제공하는 것이 중요합니다.

function Deploy([string]$server, [string]$remotePath, [string]$localPath) {
        $msdeploy = "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe";
        cmd.exe /C $("`"{3}`" -verb:sync -source:contentPath=`"{0}`" -dest:computerName=`"{1}`",contentPath=`"{2}`" " -f $localPath, $server, $remotePath , $msdeploy )
    }

사용.

Deploy $hostName $remotePath $source

위의 모든 것들이 저에게는 효과가 없었습니다. 이것이 효과가 있었던 해결책입니다.

# get msdeploy exe
$MSDeploy = ${env:ProgramFiles}, ${env:ProgramFiles(x86)} |
        ForEach-Object {Get-ChildItem -Path $_ -Filter 'MSDeploy.exe' -Recurse} |
        Sort-Object -Property @{Expression={[version]$_.VersionInfo.FileVersion}} -Descending |
        Select-Object -First 1 -ExpandProperty FullName

#build deploy command        
$deplyCmd = """""$MSDeploy"" -verb:sync -dest:iisApp=""Default Web Site"" -enableRule:DoNotDeleteRule -source:iisApp=""$ExtraWebFilesFolder"""    

#execute    
&cmd /c $deplyCmd

이 문제는 확실히 오래전부터 있어왔고 최근에 저는 이 문제와 씨름하는데 시간을 보냈습니다.결과는 저에게 성공적이었기 때문에 앞으로 이 질문을 찾으시는 분들께 도움이 되길 바라며 여기에 올리겠습니다.

해결해야 할 첫 번째 문제는 msdeploy 경로의 공간을 제거하는 것입니다.여기에는 두 가지 접근법이 있습니다.이 중 하나는 지속적이고 서버 액세스 권한이 필요하며, 다른 하나는 PowerShell 스크립트의 맥락에서 일시적인 것입니다.둘 중에 하나면 괜찮겠지만, 선택사항이라면 첫 번째가 좋을 것 같습니다.

첫 번째 접근법의 경우, 접합점을 만듭니다.스크립트 예제:

new-item -Path "c:\MS-WebDeploy" -ItemType Junction -Value "c:/Program Files (x86)/iis/microsoft web deploy v3"

두 번째 접근 방식의 경우 PSD 드라이브를 만듭니다(이 예에서 우승).

New-PSDrive -Name "w" -PSProvider FileSystem -Root "C:/Program Files (x86)/iis/microsoft web deploy v3"

저는 아래 3가지 파워쉘 변수를 사용하고 있습니다.예를 들어, 세 개 모두 공백이 있는 것으로 가정합니다.

  • $ParamFilePath = "c:\deployment files\parameters.xml"
  • $PackageName = "c:\deployment files\My Web 사이트.zip"
  • $WebAppPath = "기본 웹 사이트"

먼저 배열을 만들고 필요에 따라 인수를 작성합니다.

#nothing needs to be done with these arguments so we'll start with them
[string[]]$arguments = @("-verb:sync", "-dest:auto", "-disableLink:AppPoolExtension", "-disableLink:ContentExtension", "-disableLink:CertificateExtension", "-allowUntrusted")

#double up on the quotes for these paths after the colon
$arguments += "-setParamFile:""$ParamFilePath"""
$arguments += "-source:package=""$PackageName"""

#must not have spaces with the commma, use single quotes on the name and value here
$arguments += "-setParam:name='IIS Web Application Name',value='$WebAppPath'"

#add your own logic for optional arguments  
$arguments += "-EnableRule:EncryptWebConfig"

이제 msdeploy 명령을 작성하고 PowerShell 이스케이프 시퀀스를 입력하여 PowerShell이 나중에 "도움이 되지" 않도록 합니다.분기점 또는 PSD 드라이브로 생성한 경로 사용

$command = "w:\msdeploy.exe" + " --% " + $arguments -join " "

마지막으로 이 명령을 스크립트 블록으로 실행합니다.

$sb = $ExecutionContext.InvokeCommand.NewScriptBlock($command) 
& $sb

이것과 코드를 조금 더 넣어서 이렇게 불리는 대본을 만들었습니다.

.\Run-WebDeploy -WebAppPath "Default Web Site" -PackageName "c:\deployment files\My Website.zip"  -ParamFilePath "c:\deployment files\parameters.xml"  -EncryptWebConfig

일반적으로 경로/이름의 공백을 없애면 많은 도움을 받을 수 있습니다.가끔은, 그렇게 할 수도 없고, 이것이 당신을 통과시킬 것입니다.

언급URL : https://stackoverflow.com/questions/3499699/how-do-you-call-msdeploy-from-powershell-when-the-parameters-have-spaces

반응형