简体   繁体   中英

Executing dynamic command in PowerShell

My script is as follows

New-Alias -Name sqlpackage -Value "C:\Program Files (x86)\Microsoft SQL 
Server\130\DAC\bin\sqlpackage.exe"
$command = "sqlpackage /Action:Publish /SourceFile:$sourceFile /tcs:$TargetConnectionString /p:ScriptRefreshModule="+"$ScriptRefreshModule"+" /p:ScriptNewConstraintValidation="+"$ScriptNewConstraintValidation"+ `
" /p:GenerateSmartDefaults="+"$GenerateSmartDefaults"+" /p:BlockOnPossibleDataLoss="+"$BlockOnPossibleDataLoss"+" /p:BackupDatabaseBeforeChanges="+"$BackupDatabaseBeforeChanges"+ `
" /v:ErrorEmailRecipients="+"$ErrorEmailRecipients"+" /v:DeploymentEnvironment="+"$environment"+ $additionalVariables
& $command

This fails with sqlpackage cmdlet not found. I tried putting the entire exe path to command instead of using alias which didnt change the outcome as well.

I also tried Invoke-Command , Invoke-Item and Invoke-Expression , all failed to run as well. I am thinking like bash script which might be my downfall. What should I do to make this command work?

It needs to be dynamic since the variables are changing according to the source files.

New-Alias wont work as it defines aliases for existing cmdlets. This function worked for me (as per here and here ):

function sqlpackage(
    $sourceFile `
    ,$TargetConnectionString `
    ,$ScriptRefreshModule `
    ,$ScriptNewConstraintValidation `
    ,$GenerateSmartDefaults `
    ,$BlockOnPossibleDataLoss `
    ,$BackupDatabaseBeforeChanges `
    ,$ErrorEmailRecipients `
    ,$environment `
    ,$additionalVariable1 `
    ,$additionalVariable2 `
    ,$additionalVariable3 `
)
    {
    $command = "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe"

    &$command `
        /Action:Publish `
        /SourceFile:$sourceFile `
        /tcs:$TargetConnectionString `
        /p:ScriptRefreshModule=$ScriptRefreshModule `
        /p:ScriptNewConstraintValidation=$ScriptNewConstraintValidation `
        /p:GenerateSmartDefaults=$GenerateSmartDefaults `
        /p:BlockOnPossibleDataLoss=$BlockOnPossibleDataLoss `
        /p:BackupDatabaseBeforeChanges=$BackupDatabaseBeforeChanges `
        /v:ErrorEmailRecipients=$ErrorEmailRecipients `
        /v:DeploymentEnvironment=$environment `
       $additionalVariable1 `
       $additionalVariable2 `
       $additionalVariable3 `
}

sqlpackage `
    $sourceFile `
    $TargetConnectionString `
    $ScriptRefreshModule `
    $ScriptNewConstraintValidation `
    $GenerateSmartDefaults `
    $BlockOnPossibleDataLoss `
    $BackupDatabaseBeforeChanges `
    $ErrorEmailRecipients `
    $environment `
    $additionalVariable1 `
    $additionalVariable2 `
    $additionalVariable3 

I used a part of your answer and moved away from Invoke and & and it worked. Also New-Alias part is working too.

New-Alias -Name sqlpackage -Value "C:\Program Files (x86)\Microsoft SQL Server\130\DAC\bin\sqlpackage.exe"
sqlpackage `
  /Action:Publish `
  /SourceFile:$sourceFile `
  /tcs:$TargetConnectionString `
  /p:ScriptRefreshModule=$ScriptRefreshModule `
  /p:ScriptNewConstraintValidation=$ScriptNewConstraintValidation `
  /p:GenerateSmartDefaults=$GenerateSmartDefaults `
  /p:BlockOnPossibleDataLoss=$BlockOnPossibleDataLoss `
  /p:BackupDatabaseBeforeChanges=$BackupDatabaseBeforeChanges `
  /v:ErrorEmailRecipients=$ErrorEmailRecipients `
  /v:DeploymentEnvironment=$environment.LifeCycle `
  $additionalVariables

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM