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
If you construct a string such as
-t fooand pass it via a variable to an external program, it is passed as a single, double-quoted argument (that is,donetwill literally see"-t foo"on its command line) - and therefore won't be recognized as parameter name-value combination.You must pass
-tandfooseparately, as elements of an array instead.When you use an array as an argument for an external program, PowerShell passes the array elements as individual, space-separated arguments:
To provide a simpler example: The equivalent of
foo -s -o "bar baz" file1is:As the first code snippet implies, you're free to mix explicitly specified arguments with those provided via an array.
As an aside:
If the array containing the argument is stored in a variable, you may alternatively use splatting, i.e yo may pass
@tableArgs(@instead of$). However, given that with external programs and arrays this is the same as passing an array (variable) directly, there is no advantage in doing so.However, splatting is necessary in order to pass programmatically constructed arguments to PowerShell commands, where it is more commonly based on a hashtable whose keys identify the target parameters, which enables passing named arguments.