kc32668287 2024-08-14 07:21 采纳率: 29.3%
浏览 16
已结题

powershell删除目录及文件空格等符号问题


D盘下有个movie的文件夹里面有如下的目录和文件(可能是下载的原因),需要把目录和.mp4、.sha2的文件去掉空格符,?等符号如下:
d:\movies\a\儿大   不由娘\儿大   不由娘第一集.mp4
d:\movies\a\儿大   不由娘\儿大,不由娘第二集.mp4
d:\movies\a\儿大   不由娘\《儿大,不由娘第三集.mp4

d:\movies\a\儿大不由娘\儿大   不由娘第一集.mp4.sha2
d:\movies\a\儿大不由娘\儿大不,由娘第二集.mp4.sha2
d:\movies\a\儿大不由娘\《儿大不由娘第三集.mp4.sha2

d:\movies\c\d\真命,天子\真命 天子1.mp4
d:\movies\c\d\真命?天子\真命,天子2.mp4
d:\movies\c\d\真命 天子\真命天?子3.mp4

d:\movies\c\d\真命,天子\真命天子1.mp4.sha2
d:\movies\c\d\真命?天子\真命天子2.mp4.sha2
d:\movies\c\d\真命 天子\真命天子3.mp4.sha2

d:\movies\速度<与激情\速度与激)情 1.mp4
d:\movies\速>度与激情\速 度与激情2.mp4
d:\movies\速度(与激情\速度与激?情?3.mp4

d:\movies\速度与激情\速度与激情 1.mp4.sha2
d:\movies\速度与激情\速 度与激情2.mp4.sha2
d:\movies\速度与激情\速度与激?情?3.mp4.sha2

需要在d:\movies下执行powershell语句,删除目录的空格符号,<,》,?等符号后,在d盘下创建1movies1相应的路径,但不拷贝文件,
d:\1movies1\a\儿大不由娘\
d:\1movies1\a\儿大不由娘\
d:\1movies1\a\儿大不由娘\
d:\1movies1\c\d\真命天子\
d:\1movies1\c\d\真命天子\
d:\1movies1\c\d\真命天子\
d:\1movies1\速度与激情\
d:\1movies1\速度与激情\
d:\1movies1\速度与激情\


然后在d盘下创建2movies2相应的路径,删除movies下目录和文件的空格符号,<,》,?等符号后,在d盘下创建2movies2相应的路径,并把文件拷贝过去,并生成的hash和URL的对应关系download.txt文件,如下
d:\2movies2\a\儿大不由娘\儿大不由娘第一集.mp4
d:\2movies2\a\儿大不由娘\儿大不由娘第二集.mp4
d:\2movies2\a\儿大不由娘\儿大不由娘第三集.mp4
d:\2movies2\a\儿大不由娘\儿大不由娘第一集.mp4.sha2
d:\2movies2\a\儿大不由娘\儿大不由娘第二集.mp4.sha2
d:\2movies2\a\儿大不由娘\儿大不由娘第三集.mp4.sha2
d:\2movies2\c\d\真命天子\真命天子1.mp4
d:\2movies2\c\d\真命天子\真命天子2.mp4
d:\2movies2\c\d\真命天子\真命天子3.mp4
d:\2movies2\c\d\真命天子\真命天子1.mp4.sha2
d:\2movies2\c\d\真命天子\真命天子2.mp4.sha2
d:\2movies2\c\d\真命天子\真命天子3.mp4.sha2
d:\2movies2\速度与激情\速度与激情1.mp4
d:\2movies2\速度与激情\速度与激情2.mp4
d:\2movies2\速度与激情\速度与激情3.mp4
d:\2movies2\速度与激情\速度与激情1.mp4.sha2
d:\2movies2\速度与激情\速度与激情2.mp4.sha2
d:\2movies2\速度与激情\速度与激情3.mp4.sha2

d:\2movies2\a\儿大不由娘\儿大不由娘第一集.mp4.sha2 的内容如下:
e3e86880069c899092058cd05c8ec3f2b46aabef
d:\2movies2\a\儿大不由娘\儿大不由娘第二集.mp4.sha2 的内容如下:
e155192142fc554525dd588fbb0f78201aba1a7c
d:\2movies2\a\儿大不由娘\儿大不由娘第三集.mp4.sha2 的内容如下:
565f7c08ba97c8167607eab88c81283f295a0c9e

其他.sha2的文件都类似d:\movies\a\儿大不由娘\儿大不由娘第一集.mp4.sha2 

在d:\2movies2\下创建download.txt内容格式如下

e3e86880069c899092058cd05c8ec3f2b46aabef;https://www1.test8.com/movies/a/儿大不由娘/儿大不由娘第一集.mp4
e155192142fc554525dd588fbb0f78201aba1a7c;https://www1.test8.com/movies/a/儿大不由娘/儿大不由娘第二集.mp4
565f7c08ba97c8167607eab88c81283f295a0c9e;https://www1.test8.com/movies/a/儿大不由娘/儿大不由娘第三集.mp4
692b77757d798bffa56b9038bceb2ebf9aa2d05b;https://www1.test8.com/movies/c/d/真命天子/真命天子1.mp4
4f006d84f63244c31130a51d4caac3f1033b230c;https://www1.test8.com/movies/c/d/真命天子/真命天子2.mp4
257eccd3a3f17a928829540114bc159e9f27085c;https://www1.test8.com/movies/c/d/真命天子/真命天子3.mp4
eca8446366e9e58bed1fcc4ceb1e1468cc3967ce;https://www1.test8.com/movies/速度与激情/速度与激情1.mp4
d7a6e54ad67a26daebec3baddd4a301a3b6884dc;https://www1.test8.com/movies/速度与激情/速度与激情2.mp4
09d4e1fdff4e7b6922deb09559a2a8f3328bff9e;https://www1.test8.com/movies/速度与激情/速度与激情3.mp4

思路:
去掉目录的空格符号
$path = "d:\movie" 
$directories = Get-ChildItem -Path $path -Directory
 
foreach ($dir in $directories) {
    $newName = $dir.Name.Replace(" ", "") # 去掉空格
    Rename-Item -Path $dir.FullName -NewName $newName
}

找到以下语句,可以删除相应的内容,但得一个个文件夹去执行,实在是太慢了,求帮助
删除文件名中的空格,中英文,中文?,(英文?无法删除)《》<>等符号,单行模式
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace ' ', ''  ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace ',', ''  ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace ',', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace '?', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace '《', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace '》', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace '>', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace '<', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace '(', '' ; Rename-Item -Path $_.FullName -NewName $newName }
Get-ChildItem -File | ForEach-Object {$newName = $_.Name -replace ')', '' ; Rename-Item -Path $_.FullName -NewName $newName }

需要把这些语句组合起来达到目的,能有语句解释的作用更好了,谢谢


  • 写回答

30条回答 默认 最新

  • 专家-皆知 2024-08-14 08:36
    关注
    获得0.15元问题酬金

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    要解决这个问题,我们可以分几个步骤来完成:首先处理目录名,然后批量处理文件名中的特殊字符,接着创建新的目录结构,最后整理文件并生成下载文本文件。以下是详细的PowerShell脚本实现这一系列操作:

    第一步:处理目录名

    # 设置原始目录路径
    $originalPath = "D:\movies"
    
    # 获取所有子目录
    $directories = Get-ChildItem -Path $originalPath -Directory -Recurse
    
    # 遍历目录,去除空格和特殊字符
    foreach ($dir in $directories) {
        $newName = $dir.Name -replace '[\s,,?《》<>()]', ''
        $newPath = Join-Path -Path $dir.Parent.FullName -ChildPath $newName
        Rename-Item -Path $dir.FullName -NewName $newName -Force
    }
    

    第二步:创建新的目录结构(仅目录)

    # 新目录的前缀
    $newFolderPathPrefix = "D:\1movies1"
    
    # 递归复制目录结构,但不包含文件
    Get-ChildItem -Path $originalPath -Directory -Recurse | ForEach-Object {
        $relativePath = $_.FullName.Substring($originalPath.Length + 1)
        $newFolderPath = Join-Path -Path $newFolderPathPrefix -ChildPath $relativePath
        if (!(Test-Path -Path $newFolderPath)) {
            New-Item -ItemType Directory -Path $newFolderPath -Force
        }
    }
    

    第三步:批量处理文件名并移动文件

    # 目标文件夹路径
    $targetFolderPath = "D:\2movies2"
    
    # 创建目标目录
    Get-ChildItem -Path $originalPath -Directory -Recurse | ForEach-Object {
        $relativePath = $_.FullName.Substring($originalPath.Length + 1)
        $newTargetPath = Join-Path -Path $targetFolderPath -ChildPath $relativePath
        if (!(Test-Path -Path $newTargetPath)) {
            New-Item -ItemType Directory -Path $newTargetPath -Force
        }
    }
    
    # 处理文件,移除特殊字符并移动到新目录
    Get-ChildItem -Path $originalPath -File -Recurse | ForEach-Object {
        $baseName = $_.BaseName -replace '[\s,,?《》<>()]', ''
        $extension = $_.Extension
        $newFileName = "$baseName$extension"
        $relativePath = $_.DirectoryName.Substring($originalPath.Length + 1)
        $newFilePath = Join-Path -Path (Join-Path -Path $targetFolderPath -ChildPath $relativePath) -ChildPath $newFileName
        
        Copy-Item -Path $_.FullName -Destination $newFilePath -Force
        if ($_.Extension -eq ".sha2") {
            # 读取并记录SHA2内容
            $sha2Content = Get-Content $_.FullName
            Add-Content -Path (Join-Path -Path $targetFolderPath -ChildPath "download.txt") -Value ("$sha2Content;https://www1.test8.com/movies/$relativePath/$newFileName")
        }
    }
    

    这段脚本首先遍历并重命名了所有目录,去除了空格和指定的特殊字符。然后,它创建了一个新的目录结构副本(1movies1),只包含目录而不复制文件。接下来,脚本遍历原始目录下的所有文件,去除文件名中的特殊字符,并将它们移动到新的目录结构(2movies2)中。对于.sha2文件,脚本还会读取其内容,并在download.txt中记录SHA2值及其对应的URL。

    请确保在运行此脚本之前备份您的数据,以防意外发生。此外,根据您的实际文件数量和目录深度,这个过程可能需要一些时间来完成。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 8月22日
  • 创建了问题 8月14日

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?