PDA

Показать полную графическую версию : [решено] Перемещение папок исходя из названия ярлыков в другой папке.


Евгений.Карпов@vk
30-04-2020, 11:42
Всем здравствуйте, прошу помочь с такой проблемой.
Нужно вырезать и переместить в конкретную папку другие папки из конкретного места исходя из названий ярлыков в первой папке.
Пример:
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
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
а если структура такая?

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
Про рекурсивный перебор в ТЗ явно не сказано. :wink:

alpap
01-05-2020, 00:53
пока он (рекурсивный перебор) случайно не нарисовался да еще именно с повтором имени.

Iska
01-05-2020, 02:53
Это как обычно ;).

Sham
01-05-2020, 13:49
рекурсивно можно и так $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
Спасибо огромное за Ваши ответы. Всё работает.




© OSzone.net 2001-2012