我想将以下参数传递给PowerShell Invoke-Sqlcmd的单引号。
批次:
set table_name=XXXX
set extract_condition=start_dt='2016-10-01'
%PS_EXE% -ExecutionPolicy ByPass %PS_DIR%\Export_S3.ps1 -StrTableName %table_name% -StrCondition %extract_condition%
PowerShell:
$StrQry="select * from " + $StrTableName + " where " + $StrCondition + ";"
Invoke-Sqlcmd -Query $StrQry
返回操作数错误,“日期与int不兼容”,可能是由于未将单引号发送到PowerShell。 (除非$ StrCondition没有无引号的引号,否则它可以工作)
在实际情况下,我们希望处理许多具有不同提取条件的表,因此应分别从列表文件中批量读取这些变量以进行循环。
如果您能给我们任何建议,我们将不胜感激。 谢谢。
答案 0 :(得分:2)
要将 literal 参数传递给脚本,请使用-File
而不是(暗示的)-Command
参数;另外,为了安全起见,请双引号:
%PS_EXE% -ExecutionPolicy ByPass -File "%PS_DIR%\Export_S3.ps1" -StrTableName "%table_name%" -StrCondition "%extract_condition%"
顺便说一句:在PowerShell Core 中,-File
现在是默认设置。
如果您使用-Command
(在Windows PowerShell中可能是默认设置),则所传递的参数将由PowerShell解释,就像它们来自PowerShell本身一样,并带有诸如start_dt='2016-10-01'
之类的令牌,即一个没有外部引号,只是具有嵌入的单引号 stripped ,您可以在PowerShell本身中进行验证:
PS> Write-Output start_dt='2016-10-01'
start_dt=2016-10-01 # !! single quotes were STRIPPED.
在这种情况下,虽然将令牌整体封装在"..."
中会有所帮助,但通常最好使用-File
,如果您的意图是将 literal 值传递给脚本-即,PowerShell收据不应该解释的值。