Команда отлично работает в консоли, но не при использовании Powershell

У меня есть сценарий PS, который должен развернуть проект на моем сервере SSIS. Когда я запускаю сгенерированную команду в консоли, она работает нормально, но когда команда выполняется из Powershell, происходит сбой из-за этой ошибки (windows):

TITLE: SQL Server Integration Services
------------------------------

The path format is invalid.
Parameter name: DestinationPath (ISDeploymentWizard)

------------------------------
ADDITIONAL INFORMATION:

The path format is invalid. (Microsoft.SqlServer.IntegrationServices.Wizard.Common)

Если я запускаю сгенерированную команду из консоли, она работает нормально:

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"

Сценарий (благодаря предложениям Гюнтера Шмитца и Янне Тукаанена):

Цитаты на самом деле выглядят так: $ProjectFileFolder = "D:\Deploy\Receive"

#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 

1 ответ

Нет необходимости объявлять следующие переменные $arg1 $arg1a $arg2 $arg3 $arg4 $arg5, просто запустите следующую команду (зачем объявлять переменные и хранить их значения в других переменных??):

& $cmd /Silent /ModelType:Project /SourcePath:$ProjectFilePath /DestinationServer:$SsisServer /DestinationPath:$DestinationPath /ProjectPassword:$ProjectFilePassword

Вам не хватает исполняемого файла в строке ниже Write-Host,

менять

& $arg1 $arg2 $arg3 $arg4 $arg5 

в

& $cmd $arg1 $arg2 $arg3 $arg4 $arg5 

Если у вас возникают проблемы с запуском консольных приложений в powershell (обычно из-за нескольких аргументов), вы можете запустить его через cmd (в powershell)

cmd /c "$cmd $arg1 $arg2 $arg3 $arg4 $arg5"

Существует также другая опция, использующая класс Process, поэтому вам не нужно использовать 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 

Вы можете проверить это для более подробной информации: PowerShell, поток вывода процесса и ошибки при запуске внешнего процесса

Уверен, что $DestinationPath должен быть не относительный путь. Измените его на полный путь, включая диск, и я думаю, что это решит вашу проблему.

Другие вопросы по тегам