【问题标题】:Move files into existing folders containing part of the filename将文件移动到包含部分文件名的现有文件夹中
【发布时间】:2020-02-09 23:01:30
【问题描述】:

你会认为这是一个重复的帖子,但我已经写了 2 天了。我尝试过 filebot、filejuggler、robobasket、moveout 和高级重命名器。我在网上搜索了所有内容,都没有解决我的问题。

我有一个名为12345678.txt 的文件,想将它移到目录C:\folders\12345678-bla bla bla\

我尝试的所有操作都将文件移动到它创建的与文件名称完全相同的文件夹中。但是我的文件夹在文件名之后还有其他字符。

这是确切的真实情况:

在此目录中:C:\F\Répertoires\FISCALITE\T2\2020 我有以客户编号命名的文件,例如75063420.txt。我需要将该文件移动到此文件夹中:C:\F\Répertoires\CLIENTS\750634_Entreprises nameofcompany\

因此,只需要文件名的前6 字符来匹配名称比文件名包含更多字符的现有文件夹。

我可能有 5000 个文件要移动,需要一种自动化的方式来移动。

【问题讨论】:

  • 欢迎来到 SO。请显示您到目前为止尝试过的内容(即您的代码)以及失败的地方。

标签: powershell file batch-file directory move


【解决方案1】:

这是filebot的解决方案:

filebot -rename "C:\F\Répertoires\FISCALITE\T2\2020" --db file --output "C:\F\Répertoires\CLIENTS" --format "{output.list().find{ it.startsWith(fn) } / fn}"

在测试和制作命令原型时,您需要添加 --action TEST--action COPY

【讨论】:

    【解决方案2】:

    这是一个未经测试的

    @Set "SourcePath=C:\F\Répertoires\FISCALITE\T2\2020"
    @Set "TargetPath=C:\F\Répertoires\CLIENTS"
    @Set "FileMask=??????*.*"
    @For /F "Delims=" %%A In (
        '""%__AppDir__%where.exe" "%SourcePath%":"%FileMask%" 2>NUL"'
    )Do @Set "BaseName=%%~nA"&For /F "Delims=" %%B In (
        'Dir /B/AD "%TargetPath%\%%BaseName:~,6%%_*" 2^>NUL'
    )Do @Move /Y "%%A" "%TargetPath%\%%~nxB">NUL 2>&1
    

    在线3,我使用通配符* 匹配所有扩展名??????*.*。如果您只是在寻找一个特定的扩展名,比如说.txt,就像您的示例一样,您可以使用??????*.txt,它将匹配所有在其基本名称中包含六个或更多字符的.txt 文件。如果您修改源和/或目标路径,请确保它没有尾随路径分隔符\

    如果%TargetPath% 中可能有多个目录具有相同的6 字符前缀,我建议您要么接受它将移动到第一个返回的目录,要么更改move 命令到copy,然后执行delete

    【讨论】:

      【解决方案3】:

      这是一种无需任何错误或冲突处理的 powershell 方法,例如多个客户端目录具有相同的六个起始字符或客户端文件夹中已存在的文件。

      $FilesToMove = 'C:\F\Répertoires\FISCALITE\T2\2020'
      $TargetPath = 'C:\F\Répertoires\CLIENTS'
      
      $Files = Get-ChildItem -Path $FilesToMove -File
      
      foreach ($File in $Files) {
          $PathToMove = Get-ChildItem -Path $TargetPath -Directory -Filter "$(($File.Basename).Substring(0,6))*" | Select-Object -First 1
          Write-Output "Moving File $File to $PathToMove"
          Move-Item -Path $File.FullName -Destination "$($PathToMove.Fullname)\$($File.Name)"
      }
      

      【讨论】:

      • 天啊奥拉夫,你是最棒的!我在这上面花了几天时间并尝试过类似的 PS 脚本,但这完全可以正常工作。我真的很感激你的帮助。我现在可以在这个周末和家人共度时光了!祝你有美好的一天。 :D
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多