You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell创建文件夹时截取文件名后缀出现末尾字符丢失问题

问题根源

出错的核心是$NewDirectoryName = $SourceFileName.TrimEnd($FileExtension)这行代码的用法错误:
TrimEnd() 接收的参数是字符数组,不是完整匹配的后缀字符串,它会删除源字符串末尾所有出现在参数内的字符,不会匹配字符顺序。比如你传入的*.epub包含的字符有*、.、e、p、u、b,只要文件名末尾是这几个字符中的任意一个,都会被删掉,这就是你遇到.epub文件末尾的e、之前的r、p被删除的原因。

修正方案

PowerShell 中的文件对象自带BaseName属性,直接返回去掉扩展名的文件名,不需要手动处理后缀,完全避免这类错误。修正后的代码如下:

Clear-Host
$SourceFileFolder = 'N:\- Books\- - BMS\- Books Needing Folders'

$MyArray = @("*.azw3", "*.cbz", "*.doc", "*.docx", "*.djvu", "*.epub", "*.mobi", "*.mp3", "*.pdf", "*.txt")

foreach ($FileExtension in $MyArray) {
    Get-ChildItem -Path $SourceFileFolder -Include $FileExtension -File -Recurse | Sort-Object | ForEach-Object {
        # 直接使用内置属性获取无扩展名的文件名
        $NewDirectoryName = $_.BaseName
        $NewDirFullPath = Join-Path -Path $SourceFileFolder -ChildPath $NewDirectoryName
        # 避免重复创建目录报错
        if (-not (Test-Path -Path $NewDirFullPath)) {
            New-Item -Path $NewDirFullPath -ItemType Directory | Out-Null
        }
        # 直接移动文件,无需手动拼接多层路径
        Move-Item -Path $_.FullName -Destination $NewDirFullPath
    }
}

本次优化还包括:

  • 取消了Set-Location切换目录的操作,直接使用绝对路径处理,避免目录切换失败导致的连锁错误
  • 去掉了-Name参数,直接操作FileInfo对象,简化路径拼接逻辑
  • 新增目录存在性判断,消除重复创建目录的冗余报错

内容的提问来源于stack exchange,提问作者TimFromPhx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:06:01