【问题标题】:Using Powershells Trimstart to remove array of characters from filename使用 Powershells Trimstart 从文件名中删除字符数组
【发布时间】:2018-11-15 13:24:28
【问题描述】:

我正在尝试进行简单的批量文件重命名,以从文件名的开头删除非标准字符(例如“0123456789-_.”),然后在文件名中添加一个字符串。

例如'12 -_myfilename.doc' 会变成 '012345 - myfilename.doc'

...其中 012345 是我的学习编号。我尝试使用下面的脚本,但在单步执行执行 trimstart 行的脚本时不断收到以下错误...

"'Name' 是只读的"属性"

我猜这不是微调启动问题,而是我试图从中收集结果的方式。

任何帮助表示赞赏。

代码的相关部分看起来像...

$MyFileObject=0
if ($MyRecursiveFlag) {
Get-ChildItem $MyStudyPath -recurse | where {$_.extension -in ".xls",”.xlsx”,".xslt",".pdf",".doc",".docx",".xlsm",".xml",".htm",".ppt"}|
ForEach-Object{

    #Check if start of the file is compliant
    $mymatch = [Regex]::Match($_, '\d{5}\s-\s')
    if ($mymatch.Success){
        #Already renamed correctly so nothing else to do
        Write-Host "Okay - no changes $($_.Name)" -ForegroundColor Green
    } else {
        #No, it's not compliant so let's remove any preceding numbers, spaces and dashes etc
        $MyFileObject = $_
        $MyFileObject.Name = $MyFileObject.Name.trimstart(" 0123456789-_.")
        #...and rename the file
        Rename-Item -LiteralPath $MyFileObject.FullName -NewName "$($MyStudyNumber + ' - ' + $MyFileObject.Name)"
        Write-Host "Renamed to $($MyFileObject.Name)" -ForegroundColor Yellow
    }
}

}

我在使用 Windows 7 PowerShell v3 和 5.1 时遇到了同样的问题

【问题讨论】:

    标签: powershell trim readonly


    【解决方案1】:

    您无法更改当前Get-ChildItem 对象的Name(在您的情况下为$MyFileObject)。

    这应该可以工作(你的脚本的一部分):

    $MyFileObject = $_
    $FileName = $MyFileObject.Name.trimstart(" 0123456789-_.")
    
    #...and rename the file
    Rename-Item -LiteralPath $MyFileObject.FullName -NewName "$($MyStudyNumber + ' - ' + $FileName)"
    Write-Host "Renamed to $FileName" -ForegroundColor Yellow
    

    【讨论】:

    • 要让终端 Write-Host 返回真正的新 $FileName,我会直接将 StudyNumber 添加到它前面。
    • 谢谢 - 代码现在完成了这项工作。重新写入主机...这仍然是我的问题,因为我的写入主机无法引用真正的新文件名。 ...除非,正如您所说,通过在 $FileName 前面加上 $MyStudyNumber。有没有一种方法可以引用新的真实文件名而不必这样做? ...例如来自 $MyFileObject?我已经尝试过,但无法在调试器中“看到”真正的新文件名。
    • @RobCodyStuff - 最简单的方法是在 Rename-Item 命令之前简单地添加定义 $Var 的行。然后在该行和Write-Host 行中使用它。 [咧嘴]
    • 感谢您的帮助。现在工作得很好。
    猜你喜欢
    • 2012-04-26
    • 2017-04-01
    • 2013-10-08
    • 2014-09-14
    • 2013-05-03
    • 2016-02-04
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多