我正在尝试通过我的foreach块重命名特定目录中的文件,但找不到任何文件。
#expected encountered filename = 3000 Miles To Graceland 2001.avi
$path = "D:\Media Holding\[UsaBit.com]_3000 Miles To Graceland 2001"
foreach($file in Get-ChildItem $path) {
"FOUND ITEM"
if (!$file.PSIsContainer) {
$fileName = $file.FullName -replace ("(\w.*?)([12]\d{3})", "$1 ($2)") -replace("\.", " ") -replace("\s{2,}", " ")
$fileExtension = $file.FullName -replace ("[^\.]*\.(\w{3,4})$", ".$1")
$fileName = $fileName + $fileExtension
Rename-Item -NewName $file $fileName
}
}
我的问题是foreach永远不会进入。我可以通过我的调试消息“FOUND ITEM”永远不会在控制台中显示来证明这一点。
我试图关注K. Brian Kelly's example of a foreach。但显然我在这里遗漏了一些东西。
我也试图根据foreach中的replace和rename参数重命名文件而不是路径中找到的目录。我不确定这些是否也是有效的,如果更有经验的眼睛可以给它一次,我会很高兴,让我知道我正在尝试的是否应该有效,如果有更好的方法。
答案 0 :(得分:5)
正如PetSerAl指出的那样,使用:
foreach($file in Get-ChildItem -LiteralPath $path) {
# ...
}
会奏效。文件名中的方括号[ ]
会导致问题,-LiteralPath
不会解释它们。
从PowerShell v2开始,它们被视为特殊字符,用于字符范围。请参阅Taking Things (Like File Paths) Literally。