web-dev-qa-db-fra.com

La commande fonctionne correctement dans la console, mais pas lorsqu'elle est utilisée par Powershell.

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 
7
Henrov

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
3
Yahfoufi

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 
2
Guenther Schmitz

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

1
Mike Twc