Добрый день , Помогите пожалуйста с батником.
У меня есть целая куча файлов такаго образца P_434308546FM.JPG , P_434308546TM.JPG
Мне нужно чтобы создавалась папка с именем 4343085 и туда перемещались все файлы у которых в название присутствует 4343085.
megaloman
19-03-2018, 22:12
@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
megaloman, Большое Вам спасибо. Все работает !!!
ripton07
05-03-2022, 01:48
Не знаю куда добавить, конкретной темы такой не нашел, но название этой подходит. Написал для себя скрипт .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" путь соответственно править по своему
Создание папки по имени файла и перемещение файла в эту папку »
Он все файлы раскидывает по разным папкам. А можно ли сделать чтоб все в одну папку?
shadowbat
29-04-2023, 18:45
А можно ли сделать чтоб все в одну папку? »
замени
NewFolderPath = ParentFolder & FileName
на
NewFolderPath = ParentFolder & 111
NewFolderPath = ParentFolder & 111 »
Во, спасибо, работает. Я так понял, 111 это имя новой папки, а своё никак поставить? Например то же New или Folder? С этими именами New и Folder не работает. Что нибудь похожее может?
shadowbat
02-05-2023, 04:31
не решение 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\""
а своё никак поставить? Например то же New или Folder? С этими именами New и Folder не работает. »
NewFolderPath = ParentFolder & "своё"
NewFolderPath = ParentFolder & "New"
NewFolderPath = ParentFolder & "Folder"
NewFolderPath = ParentFolder & "своё" »
Спасибо, работает. :yes:
Pavlo059
14-07-2023, 14:25
megaloman, Добрый день, может быть подскажете решение следующей задачи, в папке файлы называются "ФИО+служ.инфа.doc", как раскидать их по папкам с критерием только ФИО, то есть создается папка ФИО и туда все файлы сливаются с ФИО и разной служебной информацией?
Пробовал адаптировать скрипт из 2 поста, ничего не происходит после его запуска(
Pavlo059
14-07-2023, 17:10
как фио отделяется от служебной инфы. Из чего состоит служебная инфа. Пример нескольких реальных названий пожалуйста »
Иванов Иван Иванович Заявление.doc
Иванов Иван Иванович Уведомление.doc
megaloman
14-07-2023, 18:26
Если "Фамилия Имя Отчество Что то еще.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
Если "Фамилия Имя Отчество Что то еще.doc" отделяются пробелами, то »
Сработало, огромный респект!
Daswerone
11-10-2023, 11:52
Добрый день! прошу помощи!
Ситуация похожая с вышеописанными, но подработать под мои данные мозгов не хватает.
Программа выгружает файлы такого вида "текстовая часть""цифровая часть".pdf
-цифровая часть состоит из 8 символов (цифр), эта часть у всех файлов уникальна
-в текстовой части может быть что угодно, одинаковая текстовая часть встречается у нескольких файлов
задача чтобы положить в папку к этим файлам батник, запустить его и в этой же папке создались папки с именами "текстовых частей" файлов, а в них распределились файлы с соответствующими "текстовыми частями". то есть по несколько файлов в каждую папку.
но еще надо чтобы у раскиданных по папкам файлов из имени пропадала "текстовая часть" и оставалась только "цифровая часть"
megaloman
11-10-2023, 16:15
@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
Это просто супер! работает!
но если честно между текстовой и числовой частью просто огромное количество пробелов, даже не знаю сколько
ограничение в 3 пробела это от винды? или можно как-то поправить
Все равно, огромнейшее СПАСИБО
megaloman
11-10-2023, 20:30
между текстовой и числовой частью просто огромное количество пробелов, даже не знаю сколько »Сложность эти пробелы отрезать@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
megaloman,
Вы просто волшебник, работает на УРА!!! думаю многим пригодится.
еще раз спасибо!
Добрый день!
Подскажите пожалуйста написать батник следующего формата
Есть куча папок , со вложенными файлами pdf
Пример: Иванов Иван Иванович 1969 года (внутри скан с названием например 6)
Петров Петр Петрович (в папке скан с именем Петров) и т.д.
Папок более 1000+
Нужно:
Скопировать только Сканы (пдф) в определенное место , переименовав их как название папки
Заранее спасибо
DJ Mogarych
08-12-2023, 18:43
Powershell v5
$otkuda = 'C:\temp\from'
$kuda = 'C:\temp\to'
dir $otkuda -Recurse -File |% {
cp $_.FullName "$kuda\$($_.Directory.Name)$($_.Extension)"
}
Скрипт копирует файлы.
Чтобы он переносил их, замените cp на mv.
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.