在循环外声明一个包含变量的 here-string
Declare a here-string containing variables outside of a loop
我想在循环外声明一个 here-string 在变量得到解析的循环中使用该字符串。
我的理想情况如下所示。这不起作用,因为 Powershell 在进入循环之前对字符串求值一次,而不是每次在循环内求值有点明显,但仍然被它咬了。
$number = "Number $($_)"
1..2 | % { $number }
我知道我可以使用 解决方案之一
1..2 | % { "Number $($_)" }
$number = "Number {0}"
1..2 | % { $number -f $_ }
$number = "Number <replace>"
1..2 | % { $number -replace "<replace>", "$_" }
但它们有我想避免的缺点
由于字符串的大小,在循环内声明它会混淆循环的逻辑,从而降低代码的可读性。
格式化方案太容易出错,涉及变量多
在替换解决方案中,更容易匹配被替换为什么变量的内容,但我必须链接许多 replace
命令。
编辑
重读我自己的问题,很明显问题中缺少实际用例。
请注意,最终我选择了格式化选项
以下将使用一些需要在循环中替换的变量声明模板
$sqltemplate = @"
SELECT aud.dpt_mov_hex||aud.dpt_ref||aud.can_typ||TO_CHAR(aud.dte_aud-1,'YYYYMMDD')||'000001' transaction_id,
acc.dos_nbr contract_id, acc.pay_acc_nbr account_id,
CASE WHEN NULL IS NULL THEN unt.nam_unt ELSE unt.nam_unt||'<'||NULL ||'>' END product_id,
aud.dpt_ref, aud.dpt_mov_hex, aud.dpt_mov_dte uitwerkingsdatum,
CASE WHEN can_typ = 0 THEN 'VZ'||aud.dpt_mov_ven_typ ELSE 'VZ'||aud.dpt_mov_ven_typ||'-CR' END transactietype,
aud.dpt_mov_amt_eur bedrag_in_eur, aud.dte_cnv, aud.dpt_mov_fix_eur, aud.dpt_mov_con_inc, aud.dpt_mov_amt_sgn bedrag_teken,
aud.dpt_mov_amt_unt bedrag_in_units, aud.dpt_mov_amt_rte, aud.dpt_mov_amt_val_pre, aud.dpt_mov_amt_val_aft,
aud.dpt_mov_amt_ioc, aud.dte_exe verwerkingsdatum, aud.exe_mng, aud.cmt, aud.trn_nbr, aud.dte_aud datum_aanlevering, aud.can_typ
FROM lfe_dpt_mov_aud aud, vnv_isr_pay_acc acc, vnv_bel_unt unt
WHERE aud.dte_aud >= TO_DATE('$((Get-Date).ToString('dd.MM.yyyy'))', 'DD.MM.YYYY')
AND aud.dpt_ref = '{0}'
AND acc.pay_acc_nbr = '{1}'
AND unt.inv_unt = '{2}'
UNION
SELECT aud.dpt_mov_hex||aud.dpt_ref||aud.can_typ||TO_CHAR(aud.dte_aud-1,'YYYYMMDD')||'000001' transaction_id,
acc.dos_nbr contract_id, acc.pay_acc_nbr account_id,
CASE WHEN itr_rte IS NULL THEN unt.nam_unt ELSE unt.nam_unt||'<'||itr_rte ||'>' END product_id,
aud.dpt_ref, aud.dpt_mov_hex, aud.dpt_mov_dte uitwerkingsdatum,
CASE WHEN can_typ = 0 THEN 'VZ'||aud.dpt_mov_ven_typ ELSE 'VZ'||aud.dpt_mov_ven_typ||'-CR' END transactietype,
aud.dpt_mov_amt_eur bedrag_in_eur, aud.dte_cnv, aud.dpt_mov_fix_eur, aud.dpt_mov_con_inc, aud.dpt_mov_amt_sgn bedrag_teken,
aud.dpt_mov_amt_unt bedrag_in_units, aud.dpt_mov_amt_rte, aud.dpt_mov_amt_val_pre, aud.dpt_mov_amt_val_aft,
aud.dpt_mov_amt_ioc, aud.dte_exe verwerkingsdatum, aud.exe_mng, aud.cmt, aud.trn_nbr, aud.dte_aud datum_aanlevering, aud.can_typ
FROM lfe_dpt_mov_aud aud, vnv_dpt dpt, vnv_isr_pay_acc acc, vnv_bel_unt unt
WHERE aud.dpt_ref = dpt.dpt_ref
AND dpt.pay_acc = acc.pay_acc_nbr
AND dpt.inv_unt = unt.inv_unt
AND aud.dte_aud >= TO_DATE('$((Get-Date).ToString('dd.MM.yyyy'))', 'DD.MM.YYYY')
AND acc.pay_acc_nbr = '{1}'
AND unt.inv_unt = '{2}'
UNION
"@
并且此模板将用于这样的语句中
$rolledbackMatchs 是包含三个属性的自定义对象数组:dtp_ref、pay_acc_nbr 和 inv_unt.
$rolledbackMatches | ForEach-Object { $sqltemplate -f $_.dpt_ref, $_.pay_acc_nbr, $_.inv_unt }
我很难理解你在这里想要实现的目标。
首先,您永远不会定义此处字符串,您只需将 $number 定义为字符串
here-string 看起来像这样
$number = @"
Number 4
"@
如果您只想将数字推入字符串,请试试这个
foreach ($number in (1..3)){
"Number $number"
}
接近您想要的选项并且不那么模糊
我想到了几种方法:
点源此处-来自单独文件的字符串赋值:
# loop.variables.ps1
$myVar = @"
Stuff going on with $_ in here
"@
然后在循环本身中:
1..2 | % { . .\loop.variables.ps1; <# do stuff with $myVar here #> }
手动调用字符串扩展:
$hereString = @'
Stuff (not yet) going on with $_ in here
'@
1..2 | % { $myVar = $ExecutionContext.InvokeCommand.ExpandString($hereString) }
将其包装在脚本块中
(如)
$stringBlock = {
@"
Stuff going on with $_ in here
"@
}
1..2 | % { $myVar = &$stringBlock}
我想在循环外声明一个 here-string 在变量得到解析的循环中使用该字符串。
我的理想情况如下所示。这不起作用,因为 Powershell 在进入循环之前对字符串求值一次,而不是每次在循环内求值有点明显,但仍然被它咬了。
$number = "Number $($_)"
1..2 | % { $number }
我知道我可以使用
1..2 | % { "Number $($_)" }
$number = "Number {0}"
1..2 | % { $number -f $_ }
$number = "Number <replace>"
1..2 | % { $number -replace "<replace>", "$_" }
但它们有我想避免的缺点
由于字符串的大小,在循环内声明它会混淆循环的逻辑,从而降低代码的可读性。
格式化方案太容易出错,涉及变量多
在替换解决方案中,更容易匹配被替换为什么变量的内容,但我必须链接许多
replace
命令。
编辑
重读我自己的问题,很明显问题中缺少实际用例。
请注意,最终我选择了格式化选项
以下将使用一些需要在循环中替换的变量声明模板
$sqltemplate = @"
SELECT aud.dpt_mov_hex||aud.dpt_ref||aud.can_typ||TO_CHAR(aud.dte_aud-1,'YYYYMMDD')||'000001' transaction_id,
acc.dos_nbr contract_id, acc.pay_acc_nbr account_id,
CASE WHEN NULL IS NULL THEN unt.nam_unt ELSE unt.nam_unt||'<'||NULL ||'>' END product_id,
aud.dpt_ref, aud.dpt_mov_hex, aud.dpt_mov_dte uitwerkingsdatum,
CASE WHEN can_typ = 0 THEN 'VZ'||aud.dpt_mov_ven_typ ELSE 'VZ'||aud.dpt_mov_ven_typ||'-CR' END transactietype,
aud.dpt_mov_amt_eur bedrag_in_eur, aud.dte_cnv, aud.dpt_mov_fix_eur, aud.dpt_mov_con_inc, aud.dpt_mov_amt_sgn bedrag_teken,
aud.dpt_mov_amt_unt bedrag_in_units, aud.dpt_mov_amt_rte, aud.dpt_mov_amt_val_pre, aud.dpt_mov_amt_val_aft,
aud.dpt_mov_amt_ioc, aud.dte_exe verwerkingsdatum, aud.exe_mng, aud.cmt, aud.trn_nbr, aud.dte_aud datum_aanlevering, aud.can_typ
FROM lfe_dpt_mov_aud aud, vnv_isr_pay_acc acc, vnv_bel_unt unt
WHERE aud.dte_aud >= TO_DATE('$((Get-Date).ToString('dd.MM.yyyy'))', 'DD.MM.YYYY')
AND aud.dpt_ref = '{0}'
AND acc.pay_acc_nbr = '{1}'
AND unt.inv_unt = '{2}'
UNION
SELECT aud.dpt_mov_hex||aud.dpt_ref||aud.can_typ||TO_CHAR(aud.dte_aud-1,'YYYYMMDD')||'000001' transaction_id,
acc.dos_nbr contract_id, acc.pay_acc_nbr account_id,
CASE WHEN itr_rte IS NULL THEN unt.nam_unt ELSE unt.nam_unt||'<'||itr_rte ||'>' END product_id,
aud.dpt_ref, aud.dpt_mov_hex, aud.dpt_mov_dte uitwerkingsdatum,
CASE WHEN can_typ = 0 THEN 'VZ'||aud.dpt_mov_ven_typ ELSE 'VZ'||aud.dpt_mov_ven_typ||'-CR' END transactietype,
aud.dpt_mov_amt_eur bedrag_in_eur, aud.dte_cnv, aud.dpt_mov_fix_eur, aud.dpt_mov_con_inc, aud.dpt_mov_amt_sgn bedrag_teken,
aud.dpt_mov_amt_unt bedrag_in_units, aud.dpt_mov_amt_rte, aud.dpt_mov_amt_val_pre, aud.dpt_mov_amt_val_aft,
aud.dpt_mov_amt_ioc, aud.dte_exe verwerkingsdatum, aud.exe_mng, aud.cmt, aud.trn_nbr, aud.dte_aud datum_aanlevering, aud.can_typ
FROM lfe_dpt_mov_aud aud, vnv_dpt dpt, vnv_isr_pay_acc acc, vnv_bel_unt unt
WHERE aud.dpt_ref = dpt.dpt_ref
AND dpt.pay_acc = acc.pay_acc_nbr
AND dpt.inv_unt = unt.inv_unt
AND aud.dte_aud >= TO_DATE('$((Get-Date).ToString('dd.MM.yyyy'))', 'DD.MM.YYYY')
AND acc.pay_acc_nbr = '{1}'
AND unt.inv_unt = '{2}'
UNION
"@
并且此模板将用于这样的语句中
$rolledbackMatchs 是包含三个属性的自定义对象数组:dtp_ref、pay_acc_nbr 和 inv_unt.
$rolledbackMatches | ForEach-Object { $sqltemplate -f $_.dpt_ref, $_.pay_acc_nbr, $_.inv_unt }
我很难理解你在这里想要实现的目标。
首先,您永远不会定义此处字符串,您只需将 $number 定义为字符串
here-string 看起来像这样
$number = @"
Number 4
"@
如果您只想将数字推入字符串,请试试这个
foreach ($number in (1..3)){
"Number $number"
}
接近您想要的选项并且不那么模糊
我想到了几种方法:
点源此处-来自单独文件的字符串赋值:
# loop.variables.ps1
$myVar = @"
Stuff going on with $_ in here
"@
然后在循环本身中:
1..2 | % { . .\loop.variables.ps1; <# do stuff with $myVar here #> }
手动调用字符串扩展:
$hereString = @'
Stuff (not yet) going on with $_ in here
'@
1..2 | % { $myVar = $ExecutionContext.InvokeCommand.ExpandString($hereString) }
将其包装在脚本块中
(如
$stringBlock = {
@"
Stuff going on with $_ in here
"@
}
1..2 | % { $myVar = &$stringBlock}