Passando argumentos com variáveis no PowerShell para o aplicativo nativo

2

Aqui está uma parte do meu script de automação de implantação:

$SVNEXE = "$env:ProgramFiles\TortoiseSVN\bin\svn.exe"
foreach ($element in $commandstoken) {
#$exportfile = [System.Web.HttpUtility]::UrlPathDecode($StreamServe5RepoURI + $commandstoken[$a])
$exportfile = ($StreamServe5RepoURI + $commandstoken[$a])
$SVNRevision = $commandstoken[$a+1]
[string]$SVNCommand = "export -r $SVNRevision --force"
Write-Host -ForegroundColor Red $SVNCommand
Write-Host -ForegroundColor Red $SVNCommand $exportfile
&"$SVNEXE" $SVNCommand $exportfile "C:\Temp\__foo\export"
$a = $a+2
}

Eu quero passar o svn.exe a variável $SVNCommand , mas o svn.exe gera um erro: svn.exe : Unknown subcommand: 'export -r 2384 --force'
Tanto quanto eu posso ver a expansão da variável está funcionando, então não consigo entender por que o svn.exe lança esse erro.

    
por Marcel Janus 16.11.2013 / 16:17

2 respostas

1

A única maneira de fazer isso funcionar é manter todos os parâmetros em uma variável separada:

$arg1 = 'export', '-r'
$arg2 = $SVNRevision
$arg3 = '--force'
$arg4 = $exportfile
$arg5 = 'C:\Temp\__foo\export\'
&"$SVNEXE" $arg1 $arg2 $arg3 $arg4 $arg5

Isso parece, na verdade, bug Executar comandos que exigem cotas e variáveis é praticamente impossível

    
por 18.11.2013 / 11:38
4

O erro Unknown subcommand: 'export -r 2384 --force' sugere que o operador de chamadas trate 'export -r 2384 --force''export -r 2384 --force' como um único argumento ( da technet no operador de & chamada ):

Things can get tricky when an external command has a lot of parameters or there are spaces in the arguments or paths! With spaces you have to nest Quotation marks and the result it is not always clear!

No seu caso, você pode fazer algo como o sugerido nessa página:

 $SVNcommand = @('export', '-r', $SVNRevieion, "--force", $exportfile, "C:\Temp\__foo\export") 

E invoque com todos os argumentos como este:

&"$SVNEXE" $SVNCommand 
    
por 16.11.2013 / 16:57