我有一个从PowerShell运行的.ps1文件,代码如下:
$strTables = ""
$tables | ForEach-Object{
$strTables += "-t $_ "
}
# $strTables = -t fisrtTable -t secondTable
dotnet ef dbcontext scaffold $strConn Npgsql.EntityFrameworkCore.PostgreSQL --context MyModel $strTables -v -f
如果我将变量 $strTable
放入命令中,它无法识别 -t
参数(但变量 $strConn
确实有效) )
Unrecognized option '-t fisrtTable -t secondTable'
如果我编写没有变量的表,它就可以工作。
dotnet ef dbcontext scaffold $strConn Npgsql.EntityFrameworkCore.PostgreSQL --context MyModel -t firstTable -t secondTable -v -f
我有太多表,无法手动执行此操作。您知道如何将变量 $strTables
与 dotnet
命令连接起来吗?
提前致谢
最佳答案
如果您构造一个字符串,例如-t foo
,并通过变量将其传递给外部程序,它将作为单、双引号参数(即,donet
将在其命令行上逐字地看到 "-t foo"
) - 因此不会被识别为参数名称-值组合。
您必须分别传递
-t
和foo
,作为 的元素数组改为。当您使用数组作为外部程序的参数时,PowerShell 将数组元素作为单独的、以空格分隔的参数传递:
# 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
提供一个更简单的示例:foo -s -o "bar baz"file1
的等效项是:
$a = '-s', '-o', 'bar baz', 'file1'; foo $a
正如第一个代码片段所暗示的那样,您可以自由地将显式指定的参数与通过数组提供的参数混合使用。
顺便说一句:
如果包含参数的数组存储在变量中,您也可以使用 splatting ,即您可以传递
@tableArgs
(@
而不是$
)。但是,考虑到对于外部程序和数组,这与直接传递数组(变量)相同,因此这样做没有任何优势。但是,为了将以编程方式构造的参数传递给 PowerShell 命令,展开是所必需的,其中更常见的是基于哈希表 em> 其键标识目标参数,从而可以传递命名参数。
关于powershell - dotnet efscaffold 无法识别的选项 '-t firstTable -t secondTable' - 传递存储在字符串中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73208362/