Показать полную графическую версию : Копирование файлов по списку соответствия логинов/имен в домашние папки пользователей
evgenyat
22-01-2020, 19:14
Здравствуйте!
Есть папка с файлами, имеющими вид C:\docs\Вася Пупкин.pdf, C:\docs\Лена Головач.pdf , на сервере находятся домашние папки этих пользователей \\server\homes\pupkin и \\server\homes\danaro, так же есть текстовый файл со строками Пупкин=pupkin и Головач=danaro . Нужно файл Вася Пупкин.pdf (обязательно с пробелом) скопировать в папку pupkin, а файл Лена Головач.pdf в папку danaro. Соответственно файлов таких больше тысячи, вручную что-то делать не вариант.
DJ Mogarych
22-01-2020, 20:04
Домен есть?
Если есть, то, может, соответствие имени и логина брать оттуда?
evgenyat, примеры реальных файлов:
C:\docs\Вася Пупкин.pdf, C:\docs\Лена Головач.pdf … текстовый файл со строками Пупкин=pupkin и Головач=danaro »
упакуйте в архив и приложите к сообщению (либо выложите на вменяемый обменник/облако).
evgenyat,
пока без серверов, просто в папку и на примере приведенных файлов:
@echo off
set "d1=C:\docs"
set "d2=C:\homes"
set "f=C:\текстовый файл.txt"
for /f "usebackq delims=" %%a in ("%f%") do set "%%a"
pushd "%d1%"
for /f "tokens=1*" %%a in ('dir /a-d/b "*.pdf"') do call :# "%%a %%b" "%d2%\%%%%~nb%%"
popd
pause& exit
:#
if exist "%~2" >nul copy "%~1" "%~2"
exit /b
Ах да, это очень важно. У меня и текстовый файл с данными и код в кодировке 866, именно так будет правильно распознана кириллица и там и там.
evgenyat
23-01-2020, 11:55
Всем спасибо за старания. Домена нет. Прикрепляю файлы для примера. alpap, сейчас попробую твой вариант.
evgenyat
23-01-2020, 12:21
alpap, не получается с твоим вариантом. Скрипт берет все файлы из исходной папки, независимо от списка и копирует их в homes, а не в папку пользователя внутри homes. Может быть с моими файлами получится подогнать скрипт? Возможно есть другие способы, как можно эту задачу решить легче?
DJ Mogarych
23-01-2020, 12:45
Powershell:
$names = Import-Csv "D:\temp\evgenyat\Names.txt" -Delimiter '=' -Header Name,Login -Encoding Default
$files = gci "D:\temp\evgenyat\Source"
foreach ($name in $names) {
$userfiles = ($files |? name -match "\W$($name.name)\W").fullname
$destination = "D:\temp\evgenyat\Server\homes\$($name.login)"
if (!(Test-Path "$destination")) {mkdir "$destination"}
if ($userfiles) {
$userfiles |copy -Destination "$destination"
}
}
evgenyat
23-01-2020, 13:09
DJ Mogarych, у меня вот такая ошибка
Copy-Item : Не удается привязать аргумент к параметру "LiteralPath", так как он представляет собой пустую строку.
C:\Users\admin\Desktop\lohn\Files\script.ps1:5 знак:72
+ ... e -match "$($name.name)").fullname |% {copy -LiteralPath "$_" -Destin ...
+ ~~~~
+ CategoryInfo : InvalidData: (:) [Copy-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.CopyItemCommand
72 знак это первая кавычка "$_"
DJ Mogarych
23-01-2020, 13:10
Поправил, пробуйте. Проверьте все пути ещё раз.
А бывает такое, что для какого-то пользователя нет файлов? добавил проверку
evgenyat
23-01-2020, 13:16
DJ Mogarych, да, бывает, и наоборот. Пробую.
DJ Mogarych, сработало на файлах для примера, буду дальше пробовать.
evgenyat
23-01-2020, 13:33
DJ Mogarych, не выходит. Возможно потому, что не для всех файлов Source есть папки? Может быть лучше файлы не копировать, а переносить, что бы было видно с какими файлами дело не пошло?
DJ Mogarych
23-01-2020, 13:40
Возможно потому, что не для всех файлов Source есть папки? »
Скрипт идёт по пользователям, перечисленным в списке. Если файлов, содержащих их имя, нет, то с ними ничего не происходит.
megaloman
23-01-2020, 13:42
evgenyat, Для вашего примера@Echo Off
cls
Set "Home=\\Server\Test1\Homes"
Set "Docs=Z:\Box_In\Docs"
Set "DocsExt=pdf"
Set "Names=Z:\Box_In\Docs\names.txt"
For /F "usebackq tokens=1,2 delims==" %%i In (`2^>nul more "%Names%"`) Do Call :MyCopy %%i %%j ||Echo --- File "%Names%" string %%i=%%j not correct
pause
Exit /B
:MyCopy
If Exist "%Docs%\* %1,*.%DocsExt%" If Exist "%Home%\%2" >nul Copy "%Docs%\* %1,*.%DocsExt%" "%Home%\%2\" &Exit /B 0
If Not Exist "%Docs%\* %1,*.%DocsExt%" Echo !!! File "%Docs%\* %1,*.%DocsExt%" not exist
If Not Exist "%Home%\%2" Echo !!! Folder "%Home%\%2" not exist
Exit /B 2При невозможности обработать строку из списка, выдаются информационные сообщения, по которым можно разобраться в причинах неуспеха
evgenyat
23-01-2020, 13:49
DJ Mogarych, сам дурак, перепутал имя/логин у себя. Все сработало, спасибо! Только одна небольшая ошибка: к имени Vano попал как свой файл, так и файл Ivanova. Это можно сделать?
megaloman, спасибо, попробую так же и этот вариант.
megaloman, все сработало как надо. А если мне нужно эти файлы не скопировать, а перенести, то что нужно изменить?
megaloman
23-01-2020, 14:37
Только одна небольшая ошибка: к имени Vano попал как свой файл, так и файл Ivanova. Это можно сделать? »Здесь надо уточнение: подозреваю, что по сравнению с решением DJ Mogarych я сделал несколько допущений, если они неверны - придётся переделывать.
1. "есть текстовый файл со строками" - я предположил, что там формат строк имябезпробела=папкабезпробела
2. Вид имён pdf-файлов: что-то впереди имябезпробела,что-то сзади.pdf. То есть я ищу в имени файла
не "имябезпробела"
а " имябезпробела," (с пробелом впереди и запятой после)
За счёт этого удалось избежать совпадения типа Vano=Ivanova в помянутом решении уважаемого DJ MogarychА если мне нужно эти файлы не скопировать, а перенести, то что нужно изменить? »Вместо Copy ..... написать Move /Y .....
DJ Mogarych
23-01-2020, 14:46
Попробуйте, поправил вверху.
evgenyat
23-01-2020, 14:51
Всем спасибо! Куда оплачивать?
DJ Mogarych,
copy : Не удалось найти часть пути "C:\Users\admin\Desktop\homes\Andreas".
C:\Users\admin\Desktop\lohn\Files\script.ps1:7 знак:17
+ ... $userfiles |copy -Destination "C:\Users\admin\Desktop\homes\$($name.l ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Copy-Item], DirectoryNotFoundException
+ FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerShell.Commands.CopyItemCommand
DJ Mogarych
23-01-2020, 16:15
Добавил создание папок пользователя, если их нет на сервере.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.