字符串比较不比较

时间:2014-10-10 15:23:34

标签: string powershell

我正在尝试运行Powershell脚本来删除目录中的某些文件。该名称必须包含blahblahblah才能删除此内容。

在我的测试子目录中,我在名称中有几个文件。但是当我执行以下代码时:

$itemsToDelete = get-childItem -path $pathName | where {$_.Name -contains blahblahblah"}

它不会选择任何项目。

我已经进行了三次检查,以确保在执行脚本时我在正确的目录中。

修改

正如我所指出的那样。我错误地使用了contains

$itemsToDelete = get-childItem -path $pathName | where {($_.Name).Contains("blahblahblah")}

正确地治愈了我的困惑。

2 个答案:

答案 0 :(得分:1)

根据作者的要求重新发表我的评论(有一些背景知识)。

来自TechNet的引用:

-Contains
  Description: Containment operator. Tells whether a collection of reference
  values includes a single test value. Always returns a Boolean value. Returns TRUE
  only when the test value exactly matches at least one of the reference values. 

  When the test value is a collection, the Contains operator uses reference
  equality. It returns TRUE only when one of the reference values is the same
  instance of the test value object.

简而言之,-Contains不允许您检查字符串是否包含特定子字符串。您需要-Match-Like。请注意,-Match会将您的测试值视为regular expression,因此您可能需要转义特殊字符。

我的观点是-Contains既不直观也不乐于助人。从理论上讲,如果你支持"don't program by coincidence"想法,这样的事情是有意义的,但对于脚本语言,它们有点矫枉过正。

答案 1 :(得分:0)

另一种方法是使用-like-unlike)与野生字符*相匹配来匹配您的搜索。这更像是SQL中的like

$itemsToDelete = get-childItem -path $pathName | where { $_.Name -like '*blahblahblah*' }