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
相关产品推荐
相关产品推荐

