Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
1

Создание ярлыков для папок из списка и перемещение ярлыков в заданную папку

07.10.2018, 15:56. Показов 6335. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Уважаемые программисты, прошу помочь с автоматизацией следующей задачи.
Есть большая папка, содержащая вложенные папки с именами типа «оф123»
Есть csv-файл с номерами (разделители-запятые, выгружен из Excel)
Необходим скрипт, который бы запускался из большой папки, и
1. делает перебор всех вложенных папок, находит папки с нужными номерами из csv ,
2. создает ярлык этой папки и
3. перемещает ярлык в указанную папку
Пути к папкам и csv-файлу необходимо иметь возможность изменять прямо в скрипте.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2018, 15:56
Ответы с готовыми решениями:

Перемещение ярлыков из подпапок в корневую папку с последующим удалением всех папок
Хочу попробовать создать батник сканирующий папку(корень) на наличие других папок, если есть папка...

Создание тайлов-ярлыков для Windows 8
Доброго времени суток. Тайлы-Tiles-Плитки Хочу создать тайлы-ярлыки, красочный ярлык в пуске...

Восстановление ярлыков не удалённых папок
Доброго времени суток уважаемые жители форума Поймал вируса.На форуме помогли его вылечить.Вся...

Исчез текст и названия ярлыков, папок
Пришел Creators Update, я обновился, после чего исчез текст из менюшек, названий любых ярлыков,...

11
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
08.10.2018, 18:45  [ТС] 2
Нужна помощь. Неужели задача невыполнима?
0
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.10.2018, 19:37 3
Лучший ответ Сообщение было отмечено Abraxis2018 как решение

Решение

Цитата Сообщение от Abraxis2018 Посмотреть сообщение
Есть csv-файл с номерами (разделители-запятые, выгружен из Excel)
И что там разделяют "разделители-запятые" если в файле только номера?

Цитата Сообщение от Abraxis2018 Посмотреть сообщение
находит папки с нужными номерами из csv
Номер из csv-файла точно соответствует имени папки или является только его частью? Если частью, то уточните как именно он может находиться в имени папки?

Цитата Сообщение от Abraxis2018 Посмотреть сообщение
Неужели задача невыполнима?
Чем яснее/точнее вы сформулируете задачу, тем быстрее вам помогут.

Добавлено через 27 минут
Допустим, есть файл:

c:\temp\numbers.csv
Кликните здесь для просмотра всего текста

"Number",
"01",
"02",
"03",
"04",
"05",
"06",
"07",
"08",
"09",
"10",


Мы будем искать все поддиректории в c:\temp, у которых имена заканчиваются на любой из номеров (из numbers.csv) и в случае такого совпадения создавать ярлык на эту папку в c:\temp

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$root = "C:\Temp"
$csv_file = "C:\Temp\numbers.csv"
$items = Import-Csv $csv_file | select -expand Number
 
cls
foreach ($folder in ls $root -dir -rec)
{
    foreach ($item in $items)
    {
        if ($folder.Name -like "*$item")
        {
            if (Test-Path ($lnk_path = "$root\$($folder.Name).lnk"))
            {
                "Ярлык $lnk_path уже создан!"
            }
            else
            {
                $shell = New-Object -ComObject WScript.Shell
                $lnk = $shell.CreateShortcut($lnk_path)
                $lnk.TargetPath = $folder.FullName
                $lnk.Save()
 
                "$lnk_path -> $($folder.FullName)"
            }
        }
    }
}
1
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
08.10.2018, 19:51  [ТС] 4
1. Я указал тип файла, который использовался при сохранении номеров из Excel
2. Есть несколько вариантов имени, например "оф123" или "оф123м14". Но ищем только по первому номеру.
3. Я сформулировал задачу с большой степенью детализации, если необходимы уточнения, я их предоставлю.
Спасибо за проявленный интерес к моей проблеме.

Добавлено через 12 минут
Почти то, что нужно, но
1. Создавать ярлык к найденной папке надо в другой папки, ее путь тоже надо прописать в коде
2. Можно ли if ($folder.Name -like "*$item") заменить на if ($folder.Name -like "*$item*"), номер это часть имени папки?
0
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.10.2018, 20:00 5
Цитата Сообщение от Abraxis2018 Посмотреть сообщение
1. Я указал тип файла, который использовался при сохранении номеров из Excel
Замечательно, а нужна его структура.

Цитата Сообщение от Abraxis2018 Посмотреть сообщение
3. Я сформулировал задачу с большой степенью детализации, если необходимы уточнения, я их предоставлю.
"находит папки с нужными номерами из csv" и "например "оф123" или "оф123м14. Но ищем только по первому номеру" - почувствуйте разницу. Об этом я и спрашивал, к сожалению, часто "формулируют задачу с большой степенью детализации", а после предложенного решения начинают добавлять вот такие нюансы, которые могут полностью поменять реализацию.

Добавлено через 7 минут
Цитата Сообщение от Abraxis2018 Посмотреть сообщение
1. Создавать ярлык к найденной папке надо в другой папки, ее путь тоже надо прописать в коде
Добавьте в начало скрипта переменную $lnkfolder:

PowerShell
1
$lnkfolder = "c:\Shortcuts"
А в строчке #12 замените переменную $root на $lnkfolder
PowerShell
1
if (Test-Path ($lnk_path = "$lnkfolder\$($folder.Name).lnk"))
Цитата Сообщение от Abraxis2018 Посмотреть сообщение
2. Можно ли if ($folder.Name -like "*$item") заменить на if ($folder.Name -like "*$item*"), номер это часть имени папки?
Нет, т.к. это будет противоречить вашему условию "ищем только по первому номеру"

Код
PS C:\> 'оф123м14' -like '*14*'
True
1
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
08.10.2018, 20:11  [ТС] 6
Проверил, все работает! Спасибо большое! Вы сэкономили мне большое количество рабочих часов!
0
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.10.2018, 20:17 7
Лучший ответ Сообщение было отмечено Abraxis2018 как решение

Решение

Цитата Сообщение от Abraxis2018 Посмотреть сообщение
Проверил, все работает!
Но скрипт из ответа #3 не учитывает ваше же доп. условие "ищем только по первому номеру". Если учесть это и добавить "Создавать ярлык к найденной папке надо в другой папки", тогда получится так:

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

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$root = "C:\Temp"
$lnkfolder = "C:\Shortcuts"
$csv_file = "C:\Temp\_Files\numbers.csv"
 
$items = Import-Csv $csv_file
 
cls
foreach ($folder in ls $root -dir -rec)
{
    foreach ($item in $items | select -expand Number)
    {
        if ($folder.Name -match "^[\D]*$item")
        {
            if (Test-Path ($lnk_path = "$lnkfolder\$($folder.Name).lnk"))
            {
                "Ярлык $lnk_path уже создан!"
            }
            else
            {
                $shell = New-Object -ComObject WScript.Shell
                $lnk = $shell.CreateShortcut($lnk_path)
                $lnk.TargetPath = $folder.FullName
                $lnk.Save()
 
                "$lnk_path -> $($folder.FullName)"
            }
        }
    }
}
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
08.10.2018, 20:29  [ТС] 8
Верно, так даже лучше. Спасибо!
0
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
08.10.2018, 21:14 9
Цитата Сообщение от Abraxis2018 Посмотреть сообщение
так даже лучше
Ещё одно важное исправление - нужно обязательно заменить:

PowerShell
1
"^[\D]*$item"
на:

PowerShell
1
"^\D*$item(\D+|$)"
Иначе, например, номера "1", "12" и "123" совпадут с именем "оф123м14"!

Код
PS C:\> $item = '12'; 'оф123м14' -match "^[\D]*$item"
True
PS C:\>$item = '12'; 'оф123м14' -match "^\D*$item(\D+|$)"
False
PS C:\> $item = '123'; 'оф123м14' -match "^\D*$item(\D+|$)"
True
Хотя, может и ещё кто-нибудь поправит паттерн
1
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
20.10.2018, 18:42  [ТС] 10
Здравствуйте, KDE777! Спасибо за Ваши дополнения, все опробовано в рабочей обстановке и отлично работает. Но должен еще раз обратиться за помощью.
Теперь ярлыки нужно сортировать не по одной, а по 19 папкам (файл csv для примера сортировки во вложении). Как правильно изменить код?
Я добавил переменных $lnkfolder1-19 для разных папок, добавил -Delimiter ";" к $items = Import-Csv $csv_file и перекопировал 19 раз условие, изменяя select -expand на названия столбцов. Но сортировка теперь не работает как надо. А там более 30000 элементов.
Вложения
Тип файла: zip Номера-19.zip (953 байт, 5 просмотров)
0
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
22.10.2018, 12:29 11
Цитата Сообщение от Abraxis2018 Посмотреть сообщение
Теперь ярлыки нужно сортировать не по одной, а по 19 папкам (файл csv для примера сортировки во вложении). Как правильно изменить код?
Правильно не код менять, а сразу писать что именно нужно.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$root = "C:\Temp"
$lnkfolder = "C:\Shortcuts"
$csv_file = "C:\Temp\Номера-19.csv"
 
$items = Import-Csv $csv_file -del ';'
$Properties = ($items[0] | Get-Member -MemberType Properties).Name
 
$Properties | %{
    if (!(Test-Path "$lnkfolder\$_")) {New-Item -Path $lnkfolder -Name $_ -ItemType directory}
}
 
cls
foreach ($folder in Get-ChildItem -Path $root -Directory -Recurse)
{
    foreach ($item in $items)
    {
        foreach ($prop in $Properties)
        {
            if ($item.$prop -and $folder.Name -match "^\D*$([regex]::Escape($item.$prop))(\D+|$)")
            {
                if (Test-Path ($lnk_path = "$lnkfolder\$prop\$($folder.Name).lnk"))
                {
                    "Ярлык $lnk_path уже создан!"
                }
                else
                {
                    $shell = New-Object -ComObject WScript.Shell
                    $lnk = $shell.CreateShortcut($lnk_path)
                    $lnk.TargetPath = $folder.FullName
                    $lnk.Save()
 
                    "$lnk_path -> $($folder.FullName)"
                }
            }
        }
    }
}
0
0 / 0 / 0
Регистрация: 19.02.2018
Сообщений: 74
24.10.2018, 16:18  [ТС] 12
KDE777, моя огромная благодарность за помощь!
0
24.10.2018, 16:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2018, 16:18
Помогаю со студенческими работами здесь

Дублирование файлов и папок файлами в виде ярлыков
Доброго времени суток. Я работаю в компании (N'). Мы приобрели лицензионную версию Kaspersky...

Как избавиться от пунктирной рамки вокруг ярлыков и папок?
Прилагаю скрин. Читал различные варианты в интернете. но мне ничего не помогло.

Пропали ВСЕ иконки (значки) ВСЕХ папок, файлов, ярлыков в Windows 10
Приветствую всех! Помогите с проблемой пожалуйста! Windows 10 Домашняя (лицензия) x64 Вчера...

sapphfire x1600xt - изображение папок и ярлыков прокрашено наполовину, видео рябит
Привет всем. У меня проблемма с картой. Отработала месяца два. После неудачных настроек (пытался...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru