매개 변수에 공백이 있을 때 파워셸에서 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=default
tmsdeploy
보고 있었습니다.
중인 입니다.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
'programing' 카테고리의 다른 글
Python 클래스에서 __init__를 사용하는 이유는 무엇입니까? (0) | 2023.09.24 |
---|---|
fs.readFileSync는 파일 상대적이지 않습니까?Node.js (0) | 2023.09.24 |
"addClass" 전에 "hasClass"를 사용해야 합니까? (0) | 2023.09.24 |
C 연산자 /\ 및 \/가 수행한 작업은 무엇입니까? (0) | 2023.09.24 |
Xcode가 "응용 프로그램 업로드 중"에 고착됨 (0) | 2023.09.24 |