Как переместить файлы в папки на основе строки, оставленной в фиксированной строке разделителя в каждом имени файла? - PullRequest
1 голос
/ 01 апреля 2019

Например, у меня есть папка с именем:

FIRSTNAME LASTNAME

И у меня есть файлы:

FIRSTNAME LASTNAME CHK#123
FIRSTNAME LASTNAME CHK#145

Я хочусделать пакет для автоматического перемещения всех файлов.У меня есть этот код из другого поста:

@echo off
setlocal enabledelayedexpansion
pushd "C:\Folders\"
for %%a in (*) do (
    set fldr=%%~na
    set fldr=!fldr:~0,4!
    md "!fldr!"
    move "%%a" "!fldr!"
)
popd
pause
exit

Но он создает папку с первыми четырьмя символами, если файл содержит более четырех символов.

Я хочу сделать следующее:Пакетный файл оценивает имя файла, останавливается на строке разделителя CHK# и перемещает файл в папку на основе имени и фамилии в имени файла слева до CHK#.

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Решение PowerShell, использующее RegEx для получения частей имени файла перед CHK#, используя
a утверждение нулевой длины предпросмотра

## Q:\Test\2019\04\01\SO_55462032.ps1

Pushd "C:\Folder"

Get-ChildItem *CHK#* -File | Where Name -match '^(.*)(?= CHK#)' | ForEach-Object {
   If(!(Test-Path $Matches[1])){New-Item -ItemType Directory -Name $Matches[1]}
   $_ | Move-Item -Destination $Matches[1]
}
PopD

Пример вывода:

> tree /F
├───FirstName
│       FirstName CHK#654
│
├───FIRSTNAME LASTNAME
│       FIRSTNAME LASTNAME CHK#123
│       FIRSTNAME LASTNAME CHK#145
│
├───Firstname Middlename Lastname
│       Firstname Middlename Lastname CHK#987
│
└───Title Firstname MiddleName Lastname
        Title Firsname MiddleName Lastname CHK#159
1 голос
/ 02 апреля 2019

Вот простое решение для пакетного файла для этой задачи:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%I in ("C:\Folders\* CHK#*") do call :ProcessFile "%%I"
endlocal
goto :EOF

:ProcessFile
set "FileName=%~nx1"
set "CheckSum=%FileName:* CHK#= CHK#%"
call set "FolderName=%%FileName:%CheckSum%=%%"
md "%~dp1%FolderName%" 2>nul
move /Y %1 "%~dp1%FolderName%"
goto :EOF

Строка после CHK# не должна иметь знак равенства или один или несколько знаков процента.

ПодпрограммаProcessFile присваивает при подстановке строки строковую часть, начиная с первого вхождения CHK# до конца имени файла, переменной среды CheckSum.

Еще одна подстановка строки используется для удаления строки контрольной суммы из файлаимя, чтобы получить имя папки.Эта командная строка дважды анализируется командным процессором Windows, так как команда call заменяет при первом разборе %CheckSum% текущее значение переменной среды CheckSum и заменяет оба %% только одним %.При втором разборе обрабатываются оставшиеся set "FolderName=%FileName: CHK#123=%", в результате чего переменной окружения FolderName присваивается строка FIRSTNAME LASTNAME для первого примера имени файла.См. Также Как синтаксический анализ сценариев интерпретатора команд Windows (CMD.EXE)?

Чтобы понять используемые команды и понять, как они работают, откройте окно командной строки и выполните следующие команды:и внимательно прочитайте все справочные страницы, отображаемые для каждой команды.

0 голосов
/ 01 апреля 2019

Один из способов разбить имя файла на части - использовать пробел и # в качестве разделителей
и проверить, равен ли 3-й токен CHK

:: Q:\Test\2019\04\01\SO_55462032.cmd
@echo off  
setlocal enabledelayedexpansion 
pushd "C:\Folders\" 
for %%F in ("* * CHK#*") do for /f "tokens=1-4 delims=# " %%A in ("%%F") Do (   
    if "%%C"=="CHK" (
        if not Exist "%%A %%B" MD "%%A %%B"
        Move "%%F" "%%A %%B"
    ) else if "%%D"=="CHK" (
        if not Exist "%%A %%B %%C" MD "%%A %%B %%C"
        Move "%%F" "%%A %%B %%C"
    )

) 
popd 
pause 
exit /b

Пример вывода:

> SO_55462032.cmd
        1 Datei(en) verschoben.
Drücken Sie eine beliebige Taste . . .
> tree a:\ /F
├───FIRSTNAME LASTNAME
│       FIRSTNAME LASTNAME CHK#123
│       FIRSTNAME LASTNAME CHK#145
│
└───Firstname Middlename Lastname
        Firstname Middlename Lastname CHK#987
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...