J'ai un script PS qui devrait déployer un projet sur mon serveur SSIS. Lorsque j'exécute la commande générée dans une console, il s'exécute correctement, mais lorsque la commande est exécutée à partir de Powershell, elle échoue à cause de l'erreur (windows):
TITRE: SQL Server Integration Services
Le format du chemin n'est pas valide. Nom du paramètre: DestinationPath (ISDeploymentWizard)
INFORMATION ADDITIONNELLE:
Le format du chemin n'est pas valide. (Microsoft.SqlServer.IntegrationServices.Wizard.Common)
Si j'exécute la commande générée à partir d'une console, tout se passe bien:
D:\Deploy\ISDeploymentWizard.exe /Silent /ModelType:Project /SourcePath:"D:\Deploy\Receive\My_Beautiful_Project.ispac" /DestinationServer:"localhost" /DestinationPath:"/SSISDB/My Beautiful Project/My_Beautiful_Project" /ProjectPassword:"SuperSecretPassword"
Le script (grâce aux suggestions de Guenther Schmitz et Janne Tukaanen):
#region script configuration
$SsisServer = "."
$ProjectFileFolder = "D:\Deploy\Receive"
$ProjectFileName = "My_Beautiful_Project.ispac"
$ProjectFilePassword = "SuperSecretPassword"
$FolderName = "My Beautiful Project"
$ProjectName = "My_Beautiful_Project"
$ISDeploymentWizard = "D:\Deploy\ISDeploymentWizard.exe"
#endregion
#region project deployment
# Create command line arguments
$DestinationPath = "/SSISDB/" + $FolderName + "/" + $ProjectName
$ProjectFilePath = $ProjectFileFolder + "\" + $ProjectFileName
$cmd = $ISDeploymentWizard
$arg1 = "/Silent"
$arg1a= "/ModelType:Project"
$arg2 = "/SourcePath:""$ProjectFilePath"""
$arg3 = "/DestinationServer:""$SsisServer"""
$arg4 = "/DestinationPath:""$DestinationPath"""
$arg5 = "/ProjectPassword:""$ProjectFilePassword"""
Write-Host "$cmd" $arg1 $arg1a $arg2 $arg3 $arg4 $arg5
& "$cmd" $arg1 $arg1a $arg2 $arg3 $arg4 $arg5
Write-Host "Done"
#endregion
Il n'est pas nécessaire de déclarer les variables suivantes $arg1 $arg1a $arg2 $arg3 $arg4 $arg5
, il suffit d'exécuter la commande suivante (pourquoi déclarer des variables et stocker leurs valeurs dans une autre variable?) :
& $cmd /Silent /ModelType:Project /SourcePath:$ProjectFilePath /DestinationServer:$SsisServer /DestinationPath:$DestinationPath /ProjectPassword:$ProjectFilePassword
l'exécutable est manquant dans la ligne en dessous de Write-Host
.
changement
& $arg1 $arg2 $arg3 $arg4 $arg5
à
& $cmd $arg1 $arg2 $arg3 $arg4 $arg5
Si vous rencontrez des problèmes pour démarrer les applications de la console dans powershell (généralement en raison de plusieurs arguments), vous pouvez l'exécuter via cmd (dans powershell).
cmd /c "$cmd $arg1 $arg2 $arg3 $arg4 $arg5"
Il y a aussi une autre option utilisant la classe Process, vous n'avez donc pas besoin d'utiliser cmd:
$ProcessInfo = New-Object System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = "D:\Deploy\ISDeploymentWizard.exe"
$ProcessInfo.Arguments = "$arg1 $arg1a $arg2 $arg3 $arg4 $arg5"
$ProcessInfo.RedirectStandardError = $true
$ProcessInfo.RedirectStandardOutput = $true
$ProcessInfo.UseShellExecute = $false
$Process = New-Object System.Diagnostics.Process
$Process.StartInfo = $ProcessInfo
$Process.Start() | Out-Null
$output = $Process.StandardOutput.ReadToEnd()
$errors = $Process.StandardError.ReadToEnd()
$Process.WaitForExit()
Write-Host $output
Write-Error $errors
Vous pouvez vérifier cela pour plus de détails: PowerShell, transmission en continu des processus et erreurs lors de l'exécution du processus externe