我正在尝试运行Powershell脚本来删除目录中的某些文件。该名称必须包含blahblahblah
才能删除此内容。
在我的测试子目录中,我在名称中有几个文件。但是当我执行以下代码时:
$itemsToDelete = get-childItem -path $pathName | where {$_.Name -contains blahblahblah"}
它不会选择任何项目。
我已经进行了三次检查,以确保在执行脚本时我在正确的目录中。
修改
正如我所指出的那样。我错误地使用了contains
。
$itemsToDelete = get-childItem -path $pathName | where {($_.Name).Contains("blahblahblah")}
正确地治愈了我的困惑。
答案 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*' }