Windows Powershell-将文件移动到名称部分匹配的现有文件夹

Windows Powershell-将文件移动到名称部分匹配的现有文件夹,windows,powershell,Windows,Powershell,我有一个文件夹,其中包含多人将贡献的图像,我有多个文件夹,其他人将使用其他内容创建,文件夹名称将与文件名相似但不完全相同(请参见下面的示例)。我曾尝试编写一个Powershell脚本(我对它还是有点生疏),将每个图像移动到其各自的文件夹中,但我遇到了一个难题,我将“无法将”System.Object[]转换为参数“Destination”所需的类型“System.String”。不支持指定的方法我尝试将目标转换为字符串,但在遍历文件夹列表时遇到问题。我在这里添加代码,希望有人能发现我在代码中犯的

我有一个文件夹,其中包含多人将贡献的图像,我有多个文件夹,其他人将使用其他内容创建,文件夹名称将与文件名相似但不完全相同(请参见下面的示例)。我曾尝试编写一个Powershell脚本(我对它还是有点生疏),将每个图像移动到其各自的文件夹中,但我遇到了一个难题,我将“无法将”System.Object[]转换为参数“Destination”所需的类型“System.String”。不支持指定的方法我尝试将目标转换为字符串,但在遍历文件夹列表时遇到问题。我在这里添加代码,希望有人能发现我在代码中犯的错误,并为我指明正确的方向。提前感谢您抽出时间来帮忙

$sourceFolder = Get-ChildItem 'C:\Example_Files_Folder' -Recurse -Filter *.png
$targetFolder = Get-ChildItem -Path 'C:\Example_Target_Folder' -Recurse -Directory

foreach ($file in $sourceFolder) {
        Where-Object { $targetFolder.Name -cin $sourceFolder.BaseName }
        move-Item -Path $file.FullName -Destination $targetFolder.FullName -WhatIf
        Write-Output "...copying $file" 
}


<# ### Folder Structure
▼sourceFolder #Root Folder containing files
├───►looking inside this folder.png
├───►you should be able to find.png
├───►quite a long list of files.png
├───►matching many folders names.png
└───►that exist inside other folders.png


▼targetFolder #Root Folder
├───▼subfolder01
│   └───►looking inside #this is a folder
├───▼subfolder02
|   └───▼subfolder002
|       └───▼subfolder0002
|           └───►you should be #also a folder
├───▼subfolder03
|   └───►quite a long #not a file, just a folder
├───▼subfolder04
|   └───►matching many folders #folder
├───▼subfolder05
|   └───►sometimes with no matching file name #yep, a folder
├───▼subfolder06
|   └─────►that exist within many folders #you get it
└───►subfolder07
### #>
$sourceFolder=Get ChildItem'C:\Example\u Files\u Folder'-Recurse-Filter*.png
$targetFolder=Get ChildItem-路径'C:\Example\u Target\u Folder'-Recurse-目录
foreach($sourceFolder中的文件){
其中对象{$targetFolder.Name-cin$sourceFolder.BaseName}
移动项目-路径$file.FullName-目标$targetFolder.FullName-WhatIf
写入输出“…正在复制$file”
}

继续我的评论。。。 您可以将其简化为以下内容:

# Target folder tree
$targetFolders = Get-ChildItem -Path 'D:\Temp\Target' -Recurse -Directory
# Results
<#
    Directory: D:\Temp\Target


Mode          LastWriteTime Length Name    
----          ------------- ------ ----    
d-----  17-Feb-21     10:22        Book    
d-----  17-Feb-21     10:10        TextData


    Directory: D:\Temp\Target\Book


Mode          LastWriteTime Length Name
----          ------------- ------ ----
d-----  17-Feb-21     10:10        Date
#>

# Source folder files to move
Get-ChildItem 'D:\Temp' -Recurse -Filter '*.txt' | 
ForEach {
    ForEach ($targetFolder in $targetFolders)
    {
        If ($PSItem.BaseName -match $targetFolder.Name)
        {Move-Item -Path $PSItem.FullName -Destination $targetFolder.FullName -WhatIf}
    }
}
# Results
<#
What if: Performing the operation "Move File" on target "Item: D:\Temp\Book- Copy (2).txt Destination: D:\Temp\Target\Book\Book- Copy (2).txt".
....
What if: Performing the operation "Move File" on target "Item: D:\Temp\DateData.txt Destination: D:\Temp\Target\Book\Date\DateData.txt".
...
What if: Performing the operation "Move File" on target "Item: D:\Temp\TextData.txt Destination: D:\Temp\Target\TextData\TextData.txt".
#>
#目标文件夹树
$targetFolders=Get ChildItem-Path'D:\Temp\Target'-Recurse-Directory
#结果
#要移动的源文件夹文件
获取子项“D:\Temp'-Recurse-Filter'*.txt'|
弗雷奇{
ForEach($targetFolders中的$targetFolder)
{
If($PSItem.BaseName-匹配$targetFolder.Name)
{移动项目-路径$PSItem.FullName-目标$targetFolder.FullName-WhatIf}
}
}
#结果

首先,此…
-cin
无效。它在中。请参阅详细信息
获取帮助-名称“*比较”
。您没有在代码中尝试处理
部分匹配的名称
、用例
(-like或-match)
,如果您说,您正在将该部分匹配移动到类似的文件夹,那么您也没有处理它。备份并一次执行一步。获取文件夹集合,按全名获取文件集合,然后在执行进一步操作之前,在嵌套循环中进行比较并获取匹配项。注意:如果有很多文件,这可能/将需要很长时间才能完成。非常感谢@postanote,这肯定解决了问题,我感谢你的解释,它非常清楚,很有启发性,我最初尝试使用其他比较运算符,最终由于对象/字符串的混合而陷入困境,但这有助于解释我的误解。