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

Евгений.Карпов@vk 30-04-2020 11:42 2919492

Перемещение папок исходя из названия ярлыков в другой папке.
 
Всем здравствуйте, прошу помочь с такой проблемой.
Нужно вырезать и переместить в конкретную папку другие папки из конкретного места исходя из названий ярлыков в первой папке.
Пример:
1 папка основная - C:\1 - в ней лежат ярлыки
2 папка C:\рабочая папка\ - в ней лежат папки
Нужно из папки C:\рабочая папка\ переместить в C:\1\ - только те папки, где есть названия ярлыков, которые содержатся в C:\1\.
Допустим лежит ярлык в C:\1\recor.exe.
В папке C:\рабочая папка\ - есть папка с таким названием (C:\рабочая папка\recor ), но есть и другие папки, нужно чтобы вырезалась и перемещалась только папка с названием "recor" в C:\1\ (потому что такое название ярлыка есть в C:\1).

Реализуемо ли это вообще? Если да, то я прошу Вас помочь.

DJ Mogarych 30-04-2020 14:22 2919508

Powershell, должно работать, по идее:

Код:

$folders = dir "C:\рабочая папка" -directory
$shortcuts = dir "C:\1\*.lnk"

foreach ($folder in $folders) {
    if ($folder.basename -in $shortcuts.basename) {
    move "$($folder.FullName)" -Destination "$(($shortcuts.directoryname)[0])"
    }
}


alpap 30-04-2020 17:15 2919523

а если структура такая?
Код:

C:\РАБОЧАЯ ПАПКА
├───2
│  └───22
│      └───recor
│              bbb.txt
│             
├───ddd
└───recor
        1.txt
        2.txt

так будет добавлена единичка (или n+1) к имени перемещаемой папки
Код:

@echo off
set "d_lnk=C:\1"
set "ext=lnk"
set "d_work=C:\рабочая папка"
set "d_out=C:\OUT"

if not exist "%d_out%" md "%d_out%"
for /f "delims=" %%a in ('dir /ad/b/s "%d_work%"') do call :l "%d_lnk%" "%ext%" "%d_out%" "%%a"
pause& exit

:l
 setlocal
  pushd "%~3"
  if exist "%~1\%~n4.%~2" if not exist "%~n4%n%" (>nul xcopy "%~4" "%~n4%n%\"& >nul 2>&1 rd /s /q "%~4") else (set /a n+=1& goto l)
  popd
 endlocal
exit /b


DJ Mogarych 30-04-2020 21:04 2919545

Про рекурсивный перебор в ТЗ явно не сказано. :wink:

alpap 01-05-2020 00:53 2919560

пока он (рекурсивный перебор) случайно не нарисовался да еще именно с повтором имени.

Iska 01-05-2020 02:53 2919566

Это как обычно ;).

Sham 01-05-2020 13:49 2919605

рекурсивно можно и так
Код:

$lnkdir = 'C:\1'
$folddir = 'C:\рабочая папка'
$names = (get-childitem $lnkdir '*.lnk').BaseName

get-childitem $folddir -directory -recurse | foreach {
        if ($_.BaseName -in $names) {
                $f0 = $lnkdir, $_.BaseName -join '\'; $c = $null
                while (test-path $($fold = $f0 + $c; $c++; $fold) -pathtype container) {
                        "$fold exists, adding 1"
                }
                move-item $_.FullName $fold -verbose
        }
}


Евгений.Карпов@vk 01-05-2020 14:10 2919608

Спасибо огромное за Ваши ответы. Всё работает.


Время: 06:37.

Время: 06:37.
© OSzone.net 2001-