更改基于位置的脚本,仅当文件夹名称存在于文本文件行中时才移动文件夹

更改基于位置的脚本,仅当文件夹名称存在于文本文件行中时才移动文件夹

我有一个文件文本錄音.txt以这种方式格式化

Lanterna Verde - Le Prime Storie;(1959 10) Showcase Presents n  22;
Lanterna Verde - Le Prime Storie;(1959 12) Showcase Presents n  23;beta;
Lanterna Verde - Le Prime Storie;alfa;(1959 14) Showcase;gamma;
Batman DC;da definire;le prime avventure;

我有 4 个文件夹以此方式命名

(1959 10) Showcase Presents n  22
(1959 12) Showcase Presents n  23
(1959 14) Showcase
le prime avventure

我使用了一个脚本来做到这一点

--> 创建 2 个文件夹,Lanterna Verde - Le Prime Storie分别称为Batman DC
--> 以这种简单的方式在文件夹结构内移动项目:

Lanterna Verde - Le Prime Storie
   |
   +-- (1959 10) Showcase Presents n  22
   +-- (1959 12) Showcase Presents n  23
   +-- (1959 14) Showcase
    
Batman DC
   |
   +--- le prime avventure

为了实现这一点,我按照以下方式设置了一个脚本

$sourcePath = 'C:\Users\Administrator\Desktop\NUOVI SCRIPTS DA CARICARE\test'
$inputFile  = Join-Path -Path $sourcePath -ChildPath 'jd.txt'
# because the title may contain invalid characters for a folder name like ':'
# create a regex to remove those if applicable
$invalid = "[{0}]" -f [RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join ''))

Import-Csv -Path $inputFile -Delimiter ';' -Header Title,FileName,Link | Group-Object Title | ForEach-Object {
    # combine the Title with the source path. Remove invalid characters from the Title
    $targetFolder = Join-Path -Path $sourcePath -ChildPath ($_.Name -replace $invalid)
    # if the destination folder does not already exist, create it
    if (!(Test-Path -Path $targetFolder -PathType Container)) {
        $null = New-Item -Path $targetFolder -ItemType Directory
    }
    foreach ($fileName in $_.Group.FileName) {
        $targetFile = Join-Path -Path $sourcePath -ChildPath $fileName
        if (Test-Path -Path $targetFile -PathType Container) {
            Move-Item -Path $targetFile -Destination $targetFolder -Force
        }
        else {
            Write-Warning "File '$targetFile' not found!"
        }
    }
}

问题是什么?

脚本创建文件夹Lanterna Verde - Le Prime StorieBatman DC但不移动项目(在这种情况下要移动的对象是其他文件夹),如文本文件中根据特定格式所示(判别式是分号;)在自己的文件夹中移动

笔记:我可以创建一个更好的 jd.txt,但含义取决于文本在特定列中的位置。我要求放宽此条件,仅依赖行中存在的文件名
。例如,如果我创建一个格式如下的 jd.txt,此脚本就可以正常工作 - 例如,如果我有 3 个文件或 3 个文件夹,如

first_name.part1.rar
second_name.part01.rar
second_name.part01.rev

,此脚本会创建 2 个文件夹:

Citadel: Forged with Fire
Eurotrack Simulator

并在其中正确移动文件。但我需要针对上述示例进行修复

答案1

您可能需要在文件夹名称后面添加一个斜杠,因为您要再次将它们连接起来。尝试将您的值写回到控制台,看看它们是否正确,另外,由于您已经在使用,因此您可以删除一些路径检查-Force

$csvpath = 'C:\temp\temp.csv'
$invalid = "[{0}]" -f [RegEx]::Escape(([IO.Path]::GetInvalidFileNameChars() -join ''))
$sourcePath = 'C:\temp\'

Import-Csv C:\temp\temp.csv -Header Title,FileName,Link -Delimiter ';' | 
  Group-Object Title | 
  Foreach {

    # I prefer to add a trailing slash to folder names
    $TargetFolder = Join-Path -Path $sourcePath -ChildPath (($_.Name -replace $invalid)+'\')

    # We don't have to create the new folders, because -Force will create them for us
    Foreach ($fileName in $_.Group.FileName) {
      $ValidFileName = $filename -replace $invalid
      $targetFile = Join-Path -Path $sourcePath -ChildPath $fileName

      # Write your values to the console - Make sure the folder is what it should be
      Write-Output "Moving '$targetFile' to '$TargetFolder'"
      Move-Item $targetFile $TargetFolder -Force -WhatIf
    }
  }

因此输出如下所示:

Moving 'C:\temp\(1959 10) Showcase Presents n  22' to 'C:\temp\Lanterna Verde - Le Prime Storie\'
What if: Performing the operation "Move File" on target "Item: C:\temp\(1959 10) Showcase Presents n  22 Destination: C:\temp\Lanterna Verde - Le Prime Storie\".

相关内容