Переместить файлы в существующие папки, содержащие часть имени файла - PullRequest
0 голосов
/ 12 октября 2019

Вы могли бы подумать, что это дублирующий пост, но я занимаюсь этим уже 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 файлов для перемещения, и мне нужен автоматизированный способ сделать это.

Ответы [ 3 ]

2 голосов
/ 12 октября 2019

Это простой способ сделать это без какой-либо обработки ошибок или конфликтов, например, несколько клиентских каталогов с теми же шестью начальными символами или файлами, которые уже существуют в папке клиента.

$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)"
}
0 голосов
/ 18 октября 2019

Вот решение для 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 при тестировании и создании прототипа команды.

0 голосов
/ 13 октября 2019

Вот непроверенный :

@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 впоследствии.

...