我有一个文件文本錄音.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 Storie
,Batman 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\".