【问题标题】:File Sorting Based on Similar File and Folder Names基于相似文件和文件夹名称的文件排序
【发布时间】:2017-06-29 03:04:19
【问题描述】:

我对 powershell 仍然很陌生,我正在尝试创建一个程序,该程序将根据文件的名称获取文件,并将它们移动到名称相似但不完全相同的文件夹中。 例如,假设我有 3 个文件,Apples.txt、Grapes.txt 和 Oranges.txt。我想将它们移动到相应的文件夹中,ApplesUSA、GrapesNY、OrangesFL。 我可以使用循环和 If-Then 语句对其进行硬编码。即如果 Apples.txt 存在,请移至 ApplesUSA。但我希望它是动态的,所以如果稍后添加其他文件和文件夹,我不必更新代码。有没有办法写一个语句,如果 FileA 和 FolderB 名称相似(都在某处的名称中包含苹果)然后将 fileA 移动到 FolderB 等等。 任何帮助表示赞赏。谢谢!!!!

【问题讨论】:

  • 在 PowerShell 中,Get-Help About_Comparison_Operators
  • 如果你能清楚地描述模式,例如“完整的文件名与文件夹名称的开头匹配”,然后是的,范围从容易到详尽搜索每个重叠字符集。如果没有比理解英语更简单的模式来建立联系,那么xkcd.com/1425
  • 好吧 id 说 80% 的文件在与它们将移动到的文件夹匹配时已失效。那是容易的部分,它的其他几个文件是问题,但模式是相同的。 Apples.txt 移动到文件夹 ApplesUSA。猜猜主要问题是如何进行可以在文件名开头进行比较的比较?

标签: powershell powershell-2.0 powershell-ise


【解决方案1】:

试试这样的

$PathWithFile="C:\temp\Test"
$PathWithDir="C:\temp\Test"

Get-ChildItem $PathWithFile -file -Filter "*.txt" | %{
$CurrentFile=$_
$Dirfounded=Get-ChildItem $PathWithDir -Directory | where {$_ -match $CurrentFile.BaseName} | select FullName -First 1
if ($Dirfounded -ne $null)
{
   move-Item $CurrentFile.FullName -Destination $Dirfounded.FullName -WhatIf
}

} 

【讨论】:

    【解决方案2】:

    类似于@Esperento 的单线器

    gci *.txt -af|%{$File=$_.FullName;gci "$($_.BaseName)*" -ad|%{Move $File -Dest $($_.FullName) -whatif}}
    

    详细版本:

    PushD "X:\path\to\base\folder"
    Get-ChildItem *.txt -File | ForEach-Object{
      $File = $_.FullName
      Get-ChildItem "$($_.BaseName)*" -Directory | ForEach-Object {
        Move-Item $File -Destination $_.FullName -whatif
      }
    }
    PopD
    

    两个版本都需要 PowerShell V3 来处理 -File-Directory 参数(及其别名 -af/-ad)这可以由额外的 |Where-Object{ $_.PSIsContainer} 相应的 | Where-Object{!$_.PSIsContainer} 代替

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多