PowerShell:如何在参数中包含单引号?

时间:2018-09-27 02:39:22

标签: powershell batch-file arguments

我想将以下参数传递给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没有无引号的引号,否则它可以工作)

在实际情况下,我们希望处理许多具有不同提取条件的表,因此应分别从列表文件中批量读取这些变量以进行循环。

如果您能给我们任何建议,我们将不胜感激。 谢谢。

1 个答案:

答案 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收据不应该解释的值。