Компьютерный форум 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=343767)

evgenyat 22-01-2020 19:14 2906308

Копирование файлов по списку соответствия логинов/имен в домашние папки пользователей
 
Здравствуйте!

Есть папка с файлами, имеющими вид 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 2906316

Домен есть?
Если есть, то, может, соответствие имени и логина брать оттуда?

Iska 22-01-2020 20:40 2906333

evgenyat, примеры реальных файлов:
Цитата:

Цитата evgenyat
C:\docs\Вася Пупкин.pdf, C:\docs\Лена Головач.pdf … текстовый файл со строками Пупкин=pupkin и Головач=danaro »

упакуйте в архив и приложите к сообщению (либо выложите на вменяемый обменник/облако).

alpap 23-01-2020 11:33 2906436

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 2906444

Вложений: 1
Всем спасибо за старания. Домена нет. Прикрепляю файлы для примера. alpap, сейчас попробую твой вариант.

evgenyat 23-01-2020 12:21 2906453

alpap, не получается с твоим вариантом. Скрипт берет все файлы из исходной папки, независимо от списка и копирует их в homes, а не в папку пользователя внутри homes. Может быть с моими файлами получится подогнать скрипт? Возможно есть другие способы, как можно эту задачу решить легче?

DJ Mogarych 23-01-2020 12:45 2906459

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 2906462

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 2906463

Поправил, пробуйте. Проверьте все пути ещё раз.
А бывает такое, что для какого-то пользователя нет файлов? добавил проверку

evgenyat 23-01-2020 13:16 2906464

DJ Mogarych, да, бывает, и наоборот. Пробую.

DJ Mogarych, сработало на файлах для примера, буду дальше пробовать.

evgenyat 23-01-2020 13:33 2906469

DJ Mogarych, не выходит. Возможно потому, что не для всех файлов Source есть папки? Может быть лучше файлы не копировать, а переносить, что бы было видно с какими файлами дело не пошло?

DJ Mogarych 23-01-2020 13:40 2906470

Цитата:

Цитата evgenyat
Возможно потому, что не для всех файлов Source есть папки? »

Скрипт идёт по пользователям, перечисленным в списке. Если файлов, содержащих их имя, нет, то с ними ничего не происходит.

megaloman 23-01-2020 13:42 2906471

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 2906473

DJ Mogarych, сам дурак, перепутал имя/логин у себя. Все сработало, спасибо! Только одна небольшая ошибка: к имени Vano попал как свой файл, так и файл Ivanova. Это можно сделать?

megaloman, спасибо, попробую так же и этот вариант.

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

megaloman 23-01-2020 14:37 2906484

Цитата:

Цитата evgenyat
Только одна небольшая ошибка: к имени Vano попал как свой файл, так и файл Ivanova. Это можно сделать? »

Здесь надо уточнение: подозреваю, что по сравнению с решением DJ Mogarych я сделал несколько допущений, если они неверны - придётся переделывать.
1. "есть текстовый файл со строками" - я предположил, что там формат строк имябезпробела=папкабезпробела
2. Вид имён pdf-файлов: что-то впереди имябезпробела,что-то сзади.pdf. То есть я ищу в имени файла
не "имябезпробела"
а " имябезпробела," (с пробелом впереди и запятой после)
За счёт этого удалось избежать совпадения типа Vano=Ivanova в помянутом решении уважаемого DJ Mogarych
Цитата:

Цитата evgenyat
А если мне нужно эти файлы не скопировать, а перенести, то что нужно изменить? »

Вместо Copy ..... написать Move /Y .....

DJ Mogarych 23-01-2020 14:46 2906487

Попробуйте, поправил вверху.

evgenyat 23-01-2020 14:51 2906488

Всем спасибо! Куда оплачивать?

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 2906500

Добавил создание папок пользователя, если их нет на сервере.


Время: 21:55.

Время: 21:55.
© OSzone.net 2001-