Как обойтись без переменной "%~dp0"

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем vavun, 22 июн 2014.

Метки:
  1. vavun
    Оффлайн

    vavun Активный пользователь

    Сообщения:
    80
    Симпатии:
    32
    Здравствуйте ;)

    Обнаружил на форуме такую замечательную вещь, как поиск в интернете из контекстного меню проводника

    Решил подправить под себя, а именно добавить иконки для удобства. Иконки добавлены, но возник вопрос: на сколько опасно использовать переменную %~dp0 , и какие есть выходы и альтернативы ?


    Код (Text):
    @set @x=0; /*
    @echo off
    SetLocal EnableExtensions DisableDelayedExpansion
    set "live=%USERPROFILE%"

    REG ADD "HKCR\AllFilesystemObjects\Shell" /f >nul 2>&1 || if "%~2" neq "Admin" (
      echo Для установки надстройки требуются повышенные права.
      cscript.exe //nologo //e:jscript "%~f0"& Exit /B) else (echo Вы не обладаете необходимыми привилегиями& pause& Exit /B
    )

    :begin
    cls
    echo. Введите цифру и нажмите { ENTER }
    echo.
    echo. Установить:
    echo.
    echo 1. Поиск в Google
    echo 2. Поиск в Yandex
    echo.
    set /p "ch=Ваш выбор: "

    ::Первая часть VBS
    for /f "delims=[]" %%N in ('find /n ":UnpackVBS" ^<"%~f0"') do set /a num=%%N
    more +%num% >"%live%\KozaN.vbs" <"%~f0"

    ::Вторая часть VBS
    if "%ch%"=="1" (
      set VerbName=Найти в "Google"
      >> "%live%\KozaN.vbs" echo CreateObject^("WScript.Shell"^).Run "explorer ""https://google.ru/search?ie=UTF-8&hl=ru&q=" ^& Arg ^& """"
      REG ADD "HKCR\AllFilesystemObjects\Shell\CopyAsPath"  /v Icon  /t REG_SZ /d "%USERPROFILE%\google.ico" /f
      1>nul copy "%~dp0"google.ico %USERPROFILE% /y
    )

    if "%ch%"=="2" (
      set VerbName=Найти в "Яндекс"
      >> "%live%\KozaN.vbs" echo CreateObject^("WScript.Shell"^).Run "explorer ""http://yandex.ru/yandsearch?text=" ^& Arg ^& """"
      REG ADD "HKCR\AllFilesystemObjects\Shell\CopyAsPath"  /v Icon  /t REG_SZ /d "%USERPROFILE%\yandex.ico" /f
      1>nul copy "%~dp0"yandex.ico %USERPROFILE% /y
    )

    if not Defined VerbName goto begin

    REG ADD "HKCR\AllFilesystemObjects\Shell\CopyAsPath" /f
    REG ADD "HKCR\AllFilesystemObjects\Shell\CopyAsPath"  /ve  /t REG_SZ /d "%VerbName%" /f
    REG ADD "HKCR\AllFilesystemObjects\Shell\CopyAsPath\command" /f
    REG ADD "HKCR\AllFilesystemObjects\Shell\CopyAsPath\command" /ve /d "wscript.exe //nologo \"%live%\KozaN.vbs\" \"%%1\"" /f

    echo.
    echo Установка завершена.
    echo.
    echo "SafeZone.cc"
    echo.
    pause
    Exit /B

    */try {
      var ShellApp = new ActiveXObject('Shell.Application');
      ShellApp.ShellExecute ('cmd.exe', '/c ""' + WScript.ScriptFullName + '" "" "Admin"','','runas',1);
    } catch (e) { }/*

    :UnpackVBS
      On Error Resume Next
      if WScript.Arguments.Count = 0 then WScript.Quit
      Arg = WScript.Arguments(0)
      Arg = Mid(Arg, InStrRev(Arg, "\") + 1)
      Arg = Replace(Arg, " ", "%20")
      set ShellApp = CreateObject("Shell.Application")'*/


    ЗЫ код рабочий, иконки с соответствующими названиями лежат в папке со скриптом

    Спасибо.
     
  2. Phoenix
    Оффлайн

    Phoenix Активный пользователь

    Сообщения:
    1.853
    Симпатии:
    1.837
    Спасибо за модернизацию.
    google.png yandex.png
    По моему вполне безопасно.
     
  3. vavun
    Оффлайн

    vavun Активный пользователь

    Сообщения:
    80
    Симпатии:
    32
    Я тоже не вижу причин для паники, но автор скрипта сказал, что лучше немного подправить, у меня нет причин ему не доверять.

    В частности этот момент интересует.
    --- Объединённое сообщение, 22 июн 2014, Дата первоначального сообщения: 22 июн 2014 ---
    Ладно, поставим вопрос по другому: при каких обстоятельствах переменная %~dp0 может принять неверное значение ?
    будь то на примере этого скрипта, или любого другого ?
     
  4. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.224
    Симпатии:
    4.979
    vavun, ты же говорил что при запуске скрипта от имени адмтнистратора иконки не находит? Так?
     
  5. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.224
    Симпатии:
    4.979
    vavun, проверил на компе,все нормально-нет проблем с иконкой.
    Видимо было недопонимание с обоюдной стороны.
    Обновлю ресурс.
     
    vavun нравится это.
  6. vavun
    Оффлайн

    vavun Активный пользователь

    Сообщения:
    80
    Симпатии:
    32
    Koza Nozdri, при запуске от администратора он вообще не стартует, паузы уже во все возможные места прописывал, при обычном запуске, он успешно делает элевацию и находит иконки.
    Кстати ваш оригинал тоже, только сайчас проверил
     
    Последнее редактирование: 23 июн 2014
  7. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.224
    Симпатии:
    4.979
    vavun, да я уже заметил,сейчас перепишу.
    --- Объединённое сообщение, 23 июн 2014, Дата первоначального сообщения: 23 июн 2014 ---
    Хм проблема в изменении некоторых настроек системы.
    Ждем @Dragokas
     
    vavun нравится это.
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.309
    vavun, добрый вечер !

    Ошибка в неверном расположении кавычки:
    1>nul copy "%~dp0"google.ico %USERPROFILE% /y
    а должно быть
    1>nul copy "%~dp0google.ico" "%USERPROFILE%" /y

    %~dp0 - папка расположения батника. Всегда заканчивается обратным слешем.

    %~dp0 не раскроется, если ее указать в консоле (не в батнике).
    Но это не имеет отношения к данной теме.

    В предостережении говорилось о другой переменной %cd%. Это текущая папка.
    При подтверждении элевации прав она сменяется на %SystemRoot%\System32.
    При этом изначально рабочий каталог может быть каким угодно, а не только папка расположения батника
    (например, можно задать в свойствах ярлыка к батнику или через параметры API-шной функции ShellExecute (в VBS есть аналог)).
     
    vavun нравится это.
  9. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.224
    Симпатии:
    4.979
    Dragokas, почему после первого запуска "неправильного" скрипта отказывают абсолютно все батники при запуске через ПКМ-админ?
     
  10. vavun
    Оффлайн

    vavun Активный пользователь

    Сообщения:
    80
    Симпатии:
    32
    Koza Nozdri, у меня не отказало, все работает.
     
  11. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.309
    Koza Nozdri, из-за знака & в пути к батнику.
    Похоже нормального пути решения проблемы нет. Баг ловит сам обработчик ассоциации винды.
    Придется переименовать папку.
     
  12. Kиpилл
    Оффлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.224
    Симпатии:
    4.979
    А у меня вобще все батники погасли...буду разбираться)
    --- Объединённое сообщение, 23 июн 2014 ---
    А вернуть как было мне как?
    --- Объединённое сообщение, 23 июн 2014 ---
    А все) разобрался.
    Ресурс обновлю ща.
     
    Последнее редактирование: 23 июн 2014
  13. vavun
    Оффлайн

    vavun Активный пользователь

    Сообщения:
    80
    Симпатии:
    32
    +

    Без & работает от админа. Там, где не ждали ...
    --- Объединённое сообщение, 23 июн 2014, Дата первоначального сообщения: 23 июн 2014 ---
    Стало быть возникает вопрос: как сохранить значение переменной %cd% полученное до элевации ?

    Только если записать его куда-либо, верно ?
     
  14. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.492
    Симпатии:
    4.309
    Не используйте %cd%. Зачем Вам путь к рабочему каталогу?
    Или Вам ради интереса?

    Если запускаете правой кнопкой "от имени администратора", то исходный рабочий каталог уже никак не узнаете.
    Его изменит программа consent.exe, отвечающая за вызов диалога UAC и создание дочерних процессов.
    Пользуйтесь %~dp0 - это всегда путь к папке, откуда вызван батник.
    ______________________________

    Да. Так и есть.

    Как видим, в режиме повышенных привилегий, вызов батника осуществляется с явным указанием приложения-обработчика cmd.exe
    Видимо того требует consent.exe, иначе ей не будет понятно, какое приложение вызывать.

    cmd_bug.png

    Проблема в том, что дяди из M$ в спешке прописали часто используемый ими повсеместно в реестре "шаблон" %1 %*
    думая, что здесь все тоже самое "пройдет", но в cmd очень особый парсер аргументов.
    Читать свою же справку им лень:

    cmd_syntax.png

    В результате получаем вот такой перехват "падающего" окна консоли:

    bug_intercept.png

    search.png

    А всего то нужно добавить кавычки к ассоциации. Вот так:
    %SystemRoot%\System32\cmd.exe /C ""%1" %*"

    Либо воспользоваться таким фиксом:
    Код (Microsoft Registry):
    Windows Registry Editor Version 5.00

    [HKEY_CLASSES_ROOT\cmdfile\shell\runas\command]
    @=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
      00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,63,00,6d,00,\
      64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,43,00,20,00,22,00,22,00,25,00,31,\
      00,22,00,20,00,25,00,2a,00,22,00,00,00
     
    После этого запуск любых батников со спецсимволами в имени или пути
    через контекстное меню "от имени администратора" больше не будет приводить к "падению".
    И конечно все тоже самое нужно выполнить с подразделом
    HKEY_CLASSES_ROOT\batfile\shell\runas\command
     
    Последнее редактирование: 27 июн 2014
    Phoenix, orderman, Kиpилл и 3 другим нравится это.
  15. vavun
    Оффлайн

    vavun Активный пользователь

    Сообщения:
    80
    Симпатии:
    32
    Dragokas, прочитал, переварил. Спасибо (y)
     
  16. Phoenix
    Оффлайн

    Phoenix Активный пользователь

    Сообщения:
    1.853
    Симпатии:
    1.837
    А я сначала запускал из своей другой папки, поэтому не сразу висяк поймал :Shok: Спасибо за разбор @Dragokas !
     

Поделиться этой страницей