powershellargumentsparameter-passingcommand-line-argumentsprogrammatically-created

dotnet ef scaffold Unrecognized option '-t firstTable -t secondTable' - pass arguments stored in a string


I have a .ps1 file that I run from PowerShell, the code is as follows:

$strTables = ""
$tables | ForEach-Object{            
    $strTables += "-t $_ "  
}
# $strTables = -t fisrtTable -t secondTable
dotnet ef dbcontext scaffold $strConn Npgsql.EntityFrameworkCore.PostgreSQL --context MyModel $strTables -v -f

If I put the variable $strTable in the command it does not recognise the -t parameter (but the variable $strConn does work)

Unrecognized option '-t fisrtTable -t secondTable'

If I write the tables without the variable, it works.

dotnet ef dbcontext scaffold $strConn Npgsql.EntityFrameworkCore.PostgreSQL --context MyModel -t firstTable -t secondTable -v -f

I have too many tables to do this manually. Do you know how I can concatenate variable $strTables with the dotnet command?

Thanks in advance


Solution

  • If you construct a string such as -t foo and pass it via a variable to an external program, it is passed as a single, double-quoted argument (that is, donet will literally see "-t foo" on its command line) - and therefore won't be recognized as parameter name-value combination.

    # Create an array such as '-t', 'foo', '-t', 'bar', ...
    $tableArgs = 
      $tables | ForEach-Object{            
        '-t', "$_"  
      }
    
    # Note the use of $tableArgs as-is, which causes PowerShell to pass
    # e.g. ... -t foo -t bar ... behind the scenes.
    dotnet ef dbcontext scaffold $strConn Npgsql.EntityFrameworkCore.PostgreSQL --context MyModel $tableArgs -v -f
    

    To provide a simpler example: The equivalent of foo -s -o "bar baz" file1 is:

    $a = '-s', '-o', 'bar baz', 'file1' # construct the array of arguments
    foo $a  # or: foo @a
    

    As the first code snippet implies, you're free to mix explicitly specified arguments with those provided via an array.


    As an aside: