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

iiama 29-05-2018 07:55 2815993

Перенос файлов и папок
 
Здравствуйте, помогите пожалуйста написать батник. Необходимо перенести все папки и файлы с рабочего стола (C:\Users\U001\Desktop\) за исключением ярлыков в определенную папку (D:\docs)

chcp 1251
MOVE /Y C:\Users\U001\Desktop\*.* "D:\docs\"

такая команда перемещает ярлыки и не перемещает папки.

Charg 29-05-2018 09:54 2816008

Зачем вообще этот костыль? Если тебе нужно чтобы всё то барахло которые люди хранят на рабочем столе не занимало место на диске С - просто перемести рабочий стол на диск Д. Вот и всё.

megaloman 29-05-2018 13:38 2816046

Если для одного конкретного пользователя, то:
Код:

@Echo Off
cls

Set "Users=C:\Users"
Set "Name=U001"
Set "Desk=Desktop"
Set "Out=D:\Docs"
Set "Exc=.lnk"

If Exist "%Users%\%Name%\%Desk%" Call :Dtop "%Name%" "%Users%\%Name%\%Desk%" "%Out%" "%Exc%"

Pause
GoTo :Eof

:Dtop
        Echo %1 %2
        Md "%~3_%~1" 2>nul
        >%~d3\~Exclude.tmp Echo %~4
        FOR /F "usebackq tokens=1,2 delims=>" %%i IN (`"xcopy "%~2\*.*"  "%~3_%~1\" /Exclude:%~d3\~Exclude.tmp/E /H /R /F /Y"`) DO (
                If Not "%%j"=="" (Set In=%%i &Set Ouf=%%j &Call :InDel "%%In:~0,-3%%" "%%Ouf:~1,-1%%")
        )
        For /F "usebackq delims=" %%i In (`Dir "%~2\" /B /S /A:D 2^>nul^|Sort /R`) Do 2>nul RD "%%i"
        Del %~d3\~Exclude.tmp
        Rd "%~3_%~1" 2>nul
GoTo :Eof

:InDel
        If Exist %2 Del /A:-L %1
GoTo :Eof

Если для всех пользователей прописанных в, например, C:\Users, то:
Код:

@Echo Off
cls

Set "Users=C:\Users"
Set "Desk=Desktop"
Set "Out=D:\Docs"
Set "Exc=.lnk"

FOR /F "usebackq delims=" %%d IN (`2^>nul Dir /b /A:D "%Users%\"`) DO If Exist "%Users%\%%d\%Desk%" Call :Dtop "%%d" "%Users%\%%d\%Desk%" "%Out%" "%Exc%"

Pause
GoTo :Eof

+ выделенный кусок кода из предыдущего скрипта
Примечание: Файлы пользователя будут перенесены в папку с именем пользователя, например: D:\Docs_U001

iiama 30-05-2018 01:47 2816117

Цитата:

Цитата Charg
Зачем вообще этот костыль? »

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

Необходимо: каждый день при включении компьютера, сносить все файлы и папки на диск D. Главная задача — чистый рабочий стол (с нужными ярлыками), экономия места на С — задача второстепенная.

YuS_2 30-05-2018 06:10 2816120

Цитата:

Цитата iiama
Главная задача — чистый рабочий стол (с нужными ярлыками), экономия места на С — задача второстепенная. »

Для текущего пользователя:
Код:

@echo off
set "dst=d:\docs\%username%\desktop"
:loop
if exist "%dst%\" (set "dst=%dst%_"&goto loop)
if not exist "%dst%\" md "%dst%"
for /f "tokens=3*" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\explorer\user shell folders" /v desktop^|find "desktop"') do set "desktop=%%i"
robocopy "%desktop%" "%dst%" /xf "*.lnk" "*.ini" /s /e /tee /move
pause&exit /b


DJ Mogarych 30-05-2018 09:27 2816140

Powershell:
Код:

Move-Item -Path "C:\Users\U001\Desktop\*" -destination "D:\docs" -Exclude "*.lnk"

YuS_2 30-05-2018 12:59 2816165

Цитата:

Цитата DJ Mogarych
-Path "C:\Users\U001\Desktop\*" »

тогда уж:
powershell:
Код:

$src = [environment]::getfolderpath("desktop")
if (!(test-path ($dst = "d:\docs\$env:username"))){md $dst}
mi "$src\*" $dst -exc '*.lnk' -whatif

но если присутствуют каталоги и вложенные в них ярлыки, они также будут перемещены...

Перемещение с сохранением структуры и с учетом наличия исключаемых файлов в дочерних каталогах:
Код:

function move-rec ($a,$b){
        begin{$splt = $a.split('\')[-1]}
        process{
                if($_.psiscontainer){
                        if(!(test-path ($fdst = $b+($_.fullname -split $splt)[1]))){
                                md $fdst|out-null
                        }
                } else {
                        $fdst = $b+($_.directoryname -split $splt)[1]
                        mi $_.fullname $fdst
                }
        }
}

# Исходный и целевой каталоги
$src_m = [environment]::getfolderpath("desktop")
$dst_m = "d:\docs\$env:username"
# Исключаемые файлы
$ex = '*.lnk'

# перемещаем файлы с сохранением структуры
dir $src_m -rec -exc $ex|move-rec $src_m $dst_m

# удаляем пустые каталоги
dir $src_m -rec -dir|sort{$_.fullname.length} -des|%{
        if((dir $_.fullname -rec) -eq $null){del $_.fullname}
}


iiama 31-05-2018 02:33 2816227

Всем огромное спасибо, задача решена.


Время: 05:04.

Время: 05:04.
© OSzone.net 2001-