我知道这是一个新人问题,但我找不到任何东西。我认为问题可能与变量类型问题有关吗?
我正在尝试查看文件名,看看文件名中是否包含了pattern1。如果是,则将模式文本替换为“TEST”。
现在它不会出错,但它会跳过IF
,我确实在目录中有模式的文件。
无法插入实际代码,因此这里有一个示例
$pattern1 = "January"
$pattern2 = "December 31"
$path = "C:\Users\...\METRICS-TEST\Metrics 2014\January 2014 Client Metrics"
$search_results = Get-ChildItem -Path $path | Where-Object { ((! $_.PSIsContainer))}
foreach ($file in $search_results) {
if($file.Name -contains $pattern1){
$new_name = $file.Name -replace $pattern1, "TEST1"
Rename-Item -Path $file.FullName -NewName $new_name
}else{
$new_name = $file.Name -replace $pattern2, "TEST2"
Rename-Item -Path $file.FullName -NewName $new_name
}
}
答案 0 :(得分:7)
整个问题是您使用-Contains应该使用-Match。试试这个,如果您有更多条件要添加,它很容易扩展:
$pattern1 = "January"
$pattern2 = "December 31"
$path = "C:\Users\...\METRICS-TEST\Metrics 2014\January 2014 Client Metrics"
Switch(Get-ChildItem -Path $path){
{$_.Name -match $pattern1}{$new_name = $_.Name -replace $pattern1, "TEST1"
Rename-Item -Path $_.FullName -NewName $new_name}
{$_.Name -match $pattern2}{$new_name = $_.Name -replace $pattern2, "TEST2"
Rename-Item -Path $_.FullName -NewName $new_name}
}
答案 1 :(得分:7)
-contains
处理集合,而非字符串。
对于字符串,您需要-match
(用于RegEx匹配)或-like
用于简单通配符匹配:
$file.name -match $pattern1
$file.name -like "*$pattern1*"
如果您有一个字符串数组并想知道它是否包含特定字符串的一个或多个副本,那么 -contains
是合适的:
$Strings = "abc","def","ghi","jkl"
# This evaluates to true
$Strings -contains "abc"
# This evaluates to false
$Strings -contains "ab"
答案 2 :(得分:2)
我意识到我有一个接受的答案,但我认为另一个优雅的方法来处理这个问题是在一个哈希表中映射Old-To-New,与该哈希表的键匹配(正则表达式转义并与管道连接以形成正则表达式匹配模式),然后在ForEach中重命名匹配匹配而不是切换。我想在这一点上它都是学术性的。
$path = "C:\Users\...\METRICS-TEST\Metrics 2014\January 2014 Client Metrics"
$RenameMap = @{
"January" = "Test1"
"December 31" = "Test2"
}
$Pattern = "($(($RenameMap.keys|ForEach{[regex]::Escape($_)}) -join "|"))"
Get-ChildItem $Path | Where{$_.Name -match $Pattern} | ForEach {Rename-Item $_.FullName -NewName ($_.Name -Replace $Matches[1],$RenameMap[$Matches[1]])}