2016-05-02 78 views
0

我在PowerShell中有以下caml。如果我在CAML查询中对$月进行硬编码,那么它就可以工作。我使用的语法是否正确?CAML查询过滤where子句

write-host $month 
$CAML = '<Where> 
     <Eq> 
      <FieldRef Name="Period" /> 
      <Value Type="Text">$month</Value> 
     </Eq> 
     </Where>' 

回答

2

在PowerShell中,字符串或者是扩张(在Perl插补字符串),或文字

任何用双引号括起来的东西(")都是可扩展的,而单引号(')用于字符串文字,就像你的情况一样。

$month = 'Jan' 
"First month is $month" # This will result in: First month is Jan 
'First month is $month' # This will result in: First month is $month 

对于多行字符串,请使用here-string(通常在其他语言中称为here-docs)。适用同样的规则:

$CAML = @" 
<Where> 
    <Eq> 
    <FieldRef Name="Period" /> 
    <Value Type="Text">$month</Value> 
    </Eq> 
</Where> 
"@ 

如果你想用一个字符串(即如果字符串包含要保留其他特殊字符或文字$秒),但你需要插入一个特定的变量值,使用在-f格式操作as shown by @jisaak

$CAML = @' 
<Where> 
    <Eq> 
    <FieldRef Name="Period" /> 
    <Value Type="Text">{0}</Value> 
    </Eq> 
</Where> 
'@ -f $month 

要了解更多关于字符串扩张和报价,请参阅Get-Help about_Quoting_Rules

1

您的变量不会被替换,因为您使用的是单引号。你要么可以使用双引号,或者格式字符串(化名-f):

write-host $month 
$CAML = '<Where> 
     <Eq> 
      <FieldRef Name="Period" /> 
      <Value Type="Text">{0}</Value> 
     </Eq> 
     </Where>' -f $month 
+0

感谢您的快速修复。其作品。不过,我刚刚学习下面的代码也会起作用。 $ CAML =“ \t \t \t \t \t \t \t \t \t \t \t <值类型= '文本'> $($月) \t \t \t \t \t \t“ –

0

谢谢Jissak。只是想分享下面的代码,因为这个工程也是如此。

$CAML = "<Where> 
      <Eq> 
       <FieldRef Name='Period' /> 
       <Value Type='Text'>$($month)</Value> 
      </Eq> 
      </Where>" 
+1

在你的情况下,它会工作没有子表达式运算符('$()')为好。 –