Войти

Показать полную графическую версию : [решено] Создать ярлык(s) к файлам @ScriptDir & "\Folder\* \*.exe"


semiono
03-02-2010, 16:09
Собсно вопрос.
Создать (где нибудь) ярлык(и) к файлам @ScriptDir & "\Folder \ подфолдерс \ все файлы *.exe"
Уровень вложенности директорий можно сказать что определён, но количество файлов и имён надо определить авто.

Creat0R
03-02-2010, 16:41
#include <File.au3>

_FileCreateShortcut(@ScriptDir (http://www.autoitscript.com/autoit3/docs/macros.htm#@ScriptDir) & "\Folder\подфолдерс", "*.exe")

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _FileCreateShortcut($sPath, $sFilter, $sWorkDir="", $sArgs="", $sDesc="", $sIcon="", $sHotKey="", $iIconID=0, $iState=0)
$aFiles = _FileListToArray($sPath, $sFilter, 1)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, 0)

For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aFiles[0]
FileCreateShortcut (http://www.autoitscript.com/autoit3/docs/functions/FileCreateShortcut.htm)( _
$sPath & "\" & $aFiles[$i], _
$sPath & "\" & StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($aFiles[$i], "\.[^\.]*$", "") & ".lnk", _
$sWorkDir, $sArgs, $sDesc, $sIcon, $sHotKey, $iIconID, $iState)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

madmasles
03-02-2010, 16:52
А у меня таким образом создается ярлык на папку, а через него получаю доступ ко всем подпапкам и файлам внутри.
FileCreateShortcut("MyFolder", "MyShortcut.lnk")

Creat0R,
У меня, почему-то, при использовании Вашей функции создаются ярлыки с именем filelnk. Поставил точку перед "lnk" ...StringRegExpReplace($aFiles[$i], "\.[^\.]*$", "") & ".lnk"... и стало все в порядке. Почему? Точка ведь в исключениях или нет?

semiono
03-02-2010, 18:18
Есть проблема! Я думал сразу понятно будет....
Программы в папках лежат

Ну да я тут сам сморозил
подфолдерс \ все файлы *.exe"
можно подумать что все exe в одной папке лежат.

Но надо так:
Общий_рут\Папка_проги1\???.EXE
Общий_рут\Папка_проги2\???.EXE
Общий_рут\Папка_проги3\???.EXE

Так обычно и встречается часто. И понятно что поиск тут сложней, поэтому я и не берусь "думать" :)
Ярлыки лучше в общую папку слить, например на рабочий стол - %UserProfile%\Desktop
хотя это не принципиально, лишь бы они в одной паки были.

Заранее благодарю!!!

А у меня таким образом создается ярлык на папку, а через него получаю доступ ко всем подпапкам и файлам внутри. »
Поэтому и надо что у меня в подпапках дальше добираться :)

madmasles
03-02-2010, 18:58
У меня так получилось:
$avArray = _FileSearch(@ScriptDir & "\Folder", "*.exe")
DirCreate(@DesktopDir & "\MyShortcut")
For $i = 1 To $avArray[0]
$name = StringTrimRight(StringTrimLeft($avArray[$i], StringInStr($avArray[$i], "\", "", -1)), 4)
FileCreateShortcut($avArray[$i], @DesktopDir & "\MyShortcut\" & $name & ".lnk")
Next

Func _FileSearch($sPath, $sFileMask)
Local $iPID, $sStdOutRead, $aRet

$iPID = Run(@ComSpec & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir, @SW_HIDE, 6)

While 1
$sStdOutRead &= StdoutRead($iPID)
If @error <> 0 Then ExitLoop
WEnd

$aRet = StringSplit(StringStripCR(StringStripWS($sStdOutRead, 3)), @LF)
Return SetError(@error, 0, $aRet)
EndFunc ;==>_FileSearch

PS
Функция Creat0R _FileSearch($sPath, $sFileMask) (http://forum.oszone.net/post-1326507-17.html)

PPS
Если в пути встречаются русские буквы, то не работает.

madmasles
03-02-2010, 19:45
Вот так нормально отрабатывает с русскими буквами в путях:

#include <Encoding.au3>

$avArray = _FileSearch(@ScriptDir & "\Folder", "*.exe")
DirCreate(@DesktopDir & "\MyShortcut")
For $i = 1 To $avArray[0]
$name = StringTrimRight(StringTrimLeft($avArray[$i], StringInStr($avArray[$i], "\", "", -1)), 4)
FileCreateShortcut(_Encoding_CyrillicTo1251($avArray[$i]), @DesktopDir & "\MyShortcut\" & $name & ".lnk")
Next

Func _FileSearch($sPath, $sFileMask)
Local $iPID, $sStdOutRead, $aRet

$iPID = Run(@ComSpec & ' /C Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir, @SW_HIDE, 6)

While 1
$sStdOutRead &= StdoutRead($iPID)
If @error <> 0 Then ExitLoop
WEnd

$aRet = StringSplit(StringStripCR(StringStripWS($sStdOutRead, 3)), @LF)
Return SetError(@error, 0, $aRet)
EndFunc ;==>_FileSearch

UDF от Creat0R Encoding_UDF.zip (http://autoit-script.ru/index.php?action=downloads;sa=view;down=6)

Creat0R
03-02-2010, 21:40
Поставил точку перед "lnk" »
Да, это я упустил.

Вот так нормально отрабатывает с русскими буквами в путях »
А если просто добавить chcp 1251 & перед Dir? :)

semiono
04-02-2010, 15:49
Если в пути встречаются русские буквы, то не работает. »
Русские буквы в файлах втопку! Я даже с пробелами борюсь у себя. :) А скрипт лично мне самому надо. :coffee:
Надеюсь уже не глючит, тему закрываю. :) Спасибо_!

madmasles
04-02-2010, 16:09
semiono,
Вы лучше проверьте, а то у меня работает, а у Вас не будет.
Во втором варианте ( с #include <Encoding.au3>) у меня нет проблем ни с русскими буквами, ни с пробелами в путях.

semiono
04-02-2010, 16:16
madmasles, я запустил скрипт (забыл путь указать реальный) и у меня один shortcut на столе создался с именем .lnk усказывает на MyComputer :) Но потом всё наладил! Это просто инфа к дебуг информации )
Второй скрипт я не проверял, у меня <Encoding.au3> нету, а на форум я что-то не зарегистрировался,
неужели semiono кто-то там юзает или это я был не помню :) Потом проверю, а инклюд лучше бы в личку сюда было. Но спасибо полюбому! П.С. Не знаю толку от меня на автоит.ру никакого, даже стыдно региться... Лишь для своей пользы чтоль :)

Creat0R
04-02-2010, 16:37
у меня <Encoding.au3> нету »
Да он собственно не нужен в этом случае, chcp 1251 должна устранить проблему с кодировкой.

Лишь для своей пользы чтоль »
Ну так оно и задуманно для этой цели - приносить пользу таким юзерам как ты :)

madmasles
04-02-2010, 17:18
Creat0R,
Я примерно год назад мучался с этими кодировками (Windows-1251 и DOS-866) в командной строке. Ничего у меня не получилось с русскими буквами. Там что-то кривое было, то ли система, то ли руки (скорей всего - второе). Теперь, когда я нашел Вашу Encoding_UDF (огромное спасибо за нее и не только за нее), все проблемы с кодировками ушли в прошлое!!! :laiel: Стыдно признаться, но я просто не знаю как ...просто добавить chcp 1251 & перед Dir?... »

semiono
04-02-2010, 18:00
Я решил внедриться в этот код чуть чуть :)

...
$wkdr = StringTrimRight($avArray[$i], StringLen($name) + 5)
$_ico = StringTrimRight($avArray[$i], 4)
FileCreateShortcut($avArray[$i], @ProgramsDir & "\Proton\" & $name & ".lnk", $wkdr, "", $name, $_ico & ".ico", "", 0)
Люблю чтоб красиво. У меня на самом деле .ico ко всем файликам рядом лежат,
правда это только мою личную "проблему" выправляет:

[HKLM\Software\Classes\exefile\DefaultIcon]
@ ="C:\I\Icons\exec.ico"

Но зато я по автоиту научился трим юзать :)

И ещё папку меню заодно украсил
FileSetAttrib(@ProgramsDir & "\Proton","+R", 0)

IniWrite(@ProgramsDir & "\Proton\desktop.ini", ".ShellClassInfo", "InfoTip", "Proton..." )
IniWrite(@ProgramsDir & "\Proton\desktop.ini", ".ShellClassInfo", "IconFile", "%SystemRoot%\system32\shell32.dll")
IniWrite(@ProgramsDir & "\Proton\desktop.ini", ".ShellClassInfo", "IconIndex", "-9")

Creat0R
04-02-2010, 18:33
как
...просто добавить chcp 1251 & перед Dir? »

$iPID = Run(@ComSpec & ' /C ChCp 1251 & Dir "' & $sPath & '\' & $sFileMask & '" /S /B /A RASH', @SystemDir, @SW_HIDE, 6)

semiono
04-02-2010, 19:03
offtop: а я вот всегда удивляюсь зачем @ComSpec используют, я когда раньше хелп не читал вообще, cmd.exe юзал...
а что его может не быть в system32 или что-то ещё? или это просто пример хорошего тона юзать переменную?
даже меньше символов писать )

Creat0R
04-02-2010, 19:11
offtop »
Для этого есть тег off ;)

это просто пример хорошего тона юзать переменную? »
Угу, и это называется макрос а не переменная.

Creat0R
05-02-2010, 00:20
Сообщения сформировавшегося офтопа (кроме последних двух, не включая моего) перенёс в тему:
[решено] Рекурсивный поиск файла (http://forum.oszone.net/thread-164080.html).
А последние сообщения отделил в новую тему:
Как скомпилировать консольное приложение (http://forum.oszone.net/showthread.php?t=166309)




© OSzone.net 2001-2012