Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создание папки по имени файла и перемещение файла в эту папку. (http://forum.oszone.net/showthread.php?t=333842)

lovator 19-03-2018 20:00 2804270

Создание папки по имени файла и перемещение файла в эту папку.
 
Добрый день , Помогите пожалуйста с батником.
У меня есть целая куча файлов такаго образца P_434308546FM.JPG , P_434308546TM.JPG
Мне нужно чтобы создавалась папка с именем 4343085 и туда перемещались все файлы у которых в название присутствует 4343085.

megaloman 19-03-2018 22:12 2804294

Код:

@Echo off

Set "BoxIn=Z:\Box_In"
Set "Mask=P_*.jpg"
Set /A NN=7

Set "BoxOut=Z:\Box_Out"

FOR /F "usebackq tokens=1,2 delims=_" %%i IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D`) DO Call :MoveNN "%%i" "%%j" "%BoxIn%" "%BoxOut%" %NN%
GoTo :Eof

:MoveNN
        If Not Exist "%~3\%~1_%~2" GoTo :Eof
        Set "NewDir=%~2"
        Call Set "NewDir1=%%NewDir:~0,%5%%"
        Set "NewDir=%~4\%NewDir1%"
        If Not Exist "%NewDir%" Md "%NewDir%" >nul 2>&1
        Move "%~3\%~1_%NewDir1%*%~x2" "%NewDir%\" >nul 2>&1
GoTo :Eof


lovator 20-03-2018 10:11 2804353

megaloman, Большое Вам спасибо. Все работает !!!

ripton07 05-03-2022 01:48 2981131

Не знаю куда добавить, конкретной темы такой не нашел, но название этой подходит. Написал для себя скрипт .vbs для "Создание папки по имени файла и перемещение файла в эту папку" из контекстного меню для любых файлов с расширением.

Код:

On Error Resume Next
if WScript.Arguments.Count = 0 then WScript.Quit
Arg = WScript.Arguments(0)
set FSO=CreateObject ("Scripting.FileSystemObject")
File = Arg
FileName = FSO.GetBaseName(File)
FileName_ext = FSO.GetFileName(File)
ParentFolder = Left(Arg, InStrRev(Arg, "\"))
NewFolderPath = ParentFolder & FileName
NewFilePath = NewFolderPath & "\" &  FileName_ext
If not FSO.folderexists (NewFolderPath) then
fso.createfolder (NewFolderPath)
end if
If Not FSO.FileExists(NewFilePath) Then
FSO.MoveFile File, NewFolderPath & "\"
Else
MsgBox "Файл " & FileName_ext & " Уже существует в папке " & NewFolderPath, vbOKOnly + vbExclamation, "Внимание!"
End If
Set FSO = Nothing
Wscript.Quit

Ну и для добавления в реестр например так
Код:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Folder]
"MUIVerb"="Создать папку (файл)"
"Extended"=""

[HKEY_CLASSES_ROOT\*\shell\Folder\command]
@=hex(2):22,00,25,00,77,00,69,00,6e,00,64,00,69,00,72,00,25,00,5c,00,73,00,79,\
  00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,77,00,73,00,63,00,72,00,69,00,\
  70,00,74,00,2e,00,65,00,78,00,65,00,22,00,20,00,22,00,44,00,3a,00,5c,00,21,\
  04,3e,04,37,04,34,04,30,04,3d,04,38,04,35,04,20,00,3f,04,30,04,3f,04,3a,04,\
  38,04,2e,00,76,00,62,00,73,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00

По умолчанию пункт скрыт, вызывается при нажатии шифта. Кому не нужен шифт убираем строчку "Extended"=""
Команда вызова "%windir%\system32\wscript.exe" "D:\Создание папки.vbs" "%1" путь соответственно править по своему

denis19 29-04-2023 11:36 3008331

Цитата:

Цитата ripton07
Создание папки по имени файла и перемещение файла в эту папку »

Он все файлы раскидывает по разным папкам. А можно ли сделать чтоб все в одну папку?

shadowbat 29-04-2023 18:45 3008344

Цитата:

Цитата denis19
А можно ли сделать чтоб все в одну папку? »

замени
NewFolderPath = ParentFolder & FileName
на
NewFolderPath = ParentFolder & 111

denis19 29-04-2023 20:51 3008351

Цитата:

Цитата shadowbat
NewFolderPath = ParentFolder & 111 »

Во, спасибо, работает. Я так понял, 111 это имя новой папки, а своё никак поставить? Например то же New или Folder? С этими именами New и Folder не работает. Что нибудь похожее может?

shadowbat 02-05-2023 04:31 3008432

не решение 1го поста но
решение для названия темы:
вариант просто для одного любого файла через драгндроп на батник
Код:

@echo off
chcp 1251>nul

set File=%~1

for %%F in ("%File%") do (
if not exist "%%~dpnF" Md "%%~dpnF"
move "%File%" "%%~dpF%%~nF\%%~nxF">nul
)

exit /b

если повесить на ПКМ, то создаёт папки для каждого из выделенных файлов
Код:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\DirByFile]
"MUIVerb"="Создать папку по имени файла"
"Icon"="C:\\Windows\\System32\\shell32.dll,3"

[HKEY_CLASSES_ROOT\*\shell\DirByFile\command]
@="D:\\111\\Создать папку по имени файла.bat \"%1\""


Цитата:

Цитата denis19
а своё никак поставить? Например то же New или Folder? С этими именами New и Folder не работает. »

NewFolderPath = ParentFolder & "своё"
NewFolderPath = ParentFolder & "New"
NewFolderPath = ParentFolder & "Folder"

denis19 03-05-2023 21:37 3008521

Цитата:

Цитата shadowbat
NewFolderPath = ParentFolder & "своё" »

Спасибо, работает. :yes:

Pavlo059 14-07-2023 14:25 3012280

megaloman, Добрый день, может быть подскажете решение следующей задачи, в папке файлы называются "ФИО+служ.инфа.doc", как раскидать их по папкам с критерием только ФИО, то есть создается папка ФИО и туда все файлы сливаются с ФИО и разной служебной информацией?
Пробовал адаптировать скрипт из 2 поста, ничего не происходит после его запуска(

Pavlo059 14-07-2023 17:10 3012290

Цитата:

Цитата megaloman
как фио отделяется от служебной инфы. Из чего состоит служебная инфа. Пример нескольких реальных названий пожалуйста »

Иванов Иван Иванович Заявление.doc
Иванов Иван Иванович Уведомление.doc

megaloman 14-07-2023 18:26 3012291

Если "Фамилия Имя Отчество Что то еще.doc" отделяются пробелами, то
Код:

@Echo Off &rem Cls
        Set "BoxIn=Z:\Box_In"
        Set "Mask=* * * *.doc"
        Set "BoxOut=Z:\Box_In"

        If Not Exist "%BoxIn%\" (Echo !!! Folder "%BoxIn%" not found &Pause &Exit /B 2)
        If Not Exist "%BoxOut%\" (Echo !!! Folder "%BoxOut%" not found &Pause &Exit /B 2)

        For /F "usebackq tokens=1,2,3* delims= " %%i In (`2^>nul Dir /B /A:-D "%BoxIn%\%Mask%"`) Do (
                If Not Exist "%BoxOut%\%%i %%j %%k" Md "%BoxOut%\%%i %%j %%k"
                >nul Move "%BoxIn%\%%i %%j %%k %%l" "%BoxOut%\%%i %%j %%k\"
        )
pause
Exit /B 0


Pavlo059 14-07-2023 18:37 3012292

Цитата:

Цитата megaloman
Если "Фамилия Имя Отчество Что то еще.doc" отделяются пробелами, то »

Сработало, огромный респект!

Daswerone 11-10-2023 11:52 3017926

Добрый день! прошу помощи!

Ситуация похожая с вышеописанными, но подработать под мои данные мозгов не хватает.

Программа выгружает файлы такого вида "текстовая часть""цифровая часть".pdf
-цифровая часть состоит из 8 символов (цифр), эта часть у всех файлов уникальна
-в текстовой части может быть что угодно, одинаковая текстовая часть встречается у нескольких файлов

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

megaloman 11-10-2023 16:15 3017945

Код:

@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
        Set "BoxIn=%~dp0"
rem        Set "BoxIn=Z:\Box_In"

        Set "Mask=.*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\.*.*"

        Pushd "%BoxIn%" ||(Echo !!! Folder "%BoxIn%" not found &Pause &Exit /B 2)
        For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D ^|FindStr /B /R /C:"%Mask%"`) Do (
                Set "Name=%%~nf"
                Set "FName=!Name:~-8!"
                Call Set "Name=%%Name:  !FName!=!FName!%%"
                Call Set "Name=%%Name: !FName!=!FName!%%"
                2>nul Md "!Name:~0,-8!"
                >nul Call Move /Y "%%f" "!Name:~0,-8!\!FName!%%~xf"
        )
        Popd
pause
Exit /B 0

перед цифровой частью не должно быть более 3 пробелов

Daswerone 11-10-2023 16:33 3017946

Это просто супер! работает!
но если честно между текстовой и числовой частью просто огромное количество пробелов, даже не знаю сколько
ограничение в 3 пробела это от винды? или можно как-то поправить

Все равно, огромнейшее СПАСИБО

megaloman 11-10-2023 20:30 3017961

Цитата:

Цитата Daswerone
между текстовой и числовой частью просто огромное количество пробелов, даже не знаю сколько »

Сложность эти пробелы отрезать
Код:

@Echo Off
cls
SetLocal EnableExtensions EnableDelayedExpansion
        Set "BoxIn=%~dp0"
rem        Set "BoxIn=Z:\Box_In"

        Set "Mask=.*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\.*.*"

        Pushd "%BoxIn%" ||(Echo !!! Folder "%BoxIn%" not found &Pause &Exit /B 2)
        For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D ^|FindStr /B /R /C:"%Mask%"`) Do (
                Set "Name=%%~nf"
                Call :Right "%%f" "!Name:~0,-8!" "!Name:~-8!%%~xf"
        )
        Popd
pause
Exit /B 0

:Right
        Set "Txt=%~2"
        Set /A i=0
        :Begin
                Set /A i-=1
                If "!Txt:~%i%,1!"==" " GoTo :Begin
        Set /A i+=1
        If %i% Neq 0 Set "Txt=!Txt:~0,%i%!"
        2>nul Md "%Txt%"
        >nul Move /Y %1 "%Txt%\%~3"
Exit /B


Daswerone 11-10-2023 21:21 3017981

megaloman,
Вы просто волшебник, работает на УРА!!! думаю многим пригодится.
еще раз спасибо!

Deaded 08-12-2023 10:55 3021177

Добрый день!
Подскажите пожалуйста написать батник следующего формата
Есть куча папок , со вложенными файлами pdf
Пример: Иванов Иван Иванович 1969 года (внутри скан с названием например 6)
Петров Петр Петрович (в папке скан с именем Петров) и т.д.
Папок более 1000+

Нужно:
Скопировать только Сканы (пдф) в определенное место , переименовав их как название папки
Заранее спасибо

DJ Mogarych 08-12-2023 18:43 3021230

Powershell v5
Код:

$otkuda = 'C:\temp\from'
$kuda = 'C:\temp\to'

dir $otkuda -Recurse -File |% {
    cp $_.FullName "$kuda\$($_.Directory.Name)$($_.Extension)"
}

Скрипт копирует файлы.
Чтобы он переносил их, замените cp на mv.

denis19 30-03-2024 13:55 3026042

Цитата:

Цитата shadowbat
замени
NewFolderPath = ParentFolder & FileName
на
NewFolderPath = ParentFolder & 111 »

Здравствуйте ещё раз. Пользуюсь долго, всё нормально. Но понял что было бы не плохо чтоб при перемещении всплывало окошко для ввода своего имени. Можно так сделать?


Время: 12:13.

Время: 12:13.
© OSzone.net 2001-