【问题标题】:Powershell foreach with path not finding files带有路径的Powershell foreach找不到文件
【发布时间】:2015-12-04 17:55:33
【问题描述】:

我正在尝试通过我的 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 中的替换和重命名参数重命名路径中找到的文件而不是目录。我不确定这些是否有效,如果更有经验的眼睛可以试一试,让我知道我正在尝试的方法是否可行以及是否有更好的方法,我会很高兴。

【问题讨论】:

  • $file in Get-ChildItem -LiteralPath $path
  • 谢谢! -path 和 -LiteralPath 有什么区别?

标签: regex powershell foreach rename


【解决方案1】:

正如PetSerAl 指出的那样,使用:

foreach($file in Get-ChildItem -LiteralPath $path) {
    # ...
}

会起作用。您的文件名中的方括号 [ ] 会给您带来问题,而 -LiteralPath 不会解释它们。

从 PowerShell v2 开始,它们被视为特殊字符,用于字符范围。见Taking Things (Like File Paths) Literally

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2015-03-19
    • 2017-11-16
    • 2019-04-13
    • 2018-05-03
    • 2013-07-08
    • 2018-07-31
    • 2018-12-24
    相关资源
    最近更新 更多