none
Передача параметров powershell скрипту через меню "Открыть с помощью" RRS feed

  • Вопрос

  • Есть powershell скрипт, который обрабатывает некоторые данные о pdf файлах. (при его запуске вызывается окно выбора файла через windows forms и дальше происходит работа скрипта).

    Каким образом можно сделать следующее?- в окне проводника выбираются файлы и через меню "Открыть с помощью..." передаются пути к выбранным файлам скрипту?

Ответы

  • Нашёл обходное решение: Выделяются нужные файлы и правым кликом выбирается меню Отправить в (прямой ярлык на скрипт, без всяких параметров). После чего запускается скрипт в единственном экземпляре и принимает полные пути всех выделенных файлов.

    Делается следующим образом: 

    1. Добавляем два значения в реестр:

    HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler\ (Default) = {60254CA5-953B-11CF-8C96-00AA00B8708C}

    Включается возможность перетаскивать любые файлы на скрипты поувершела. (в нашем случае скрипт будет таким образом ловить полные пути к файлам)

    HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command\
    (Default) = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -File "%1" %*

    Этот ключ уже есть в системе, по умолчанию он ссылается на notepad.exe. Все ps файлы "по двойному клику" будут сразу выполняться, а не открываться как раньше в блокноте.

    2. Кидаем ярлык на наш скрипт, который будет ловить файлы в качестве параметров в меню Send To (в Win7, Win8 папка C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\SendTo)

    3. В скрипте вытаскиваем полные пути всех файлов из встроенной переменной $args в виде массива строк.

    Подробнее можно почитать тут: http://stackoverflow.com/questions/2819908/drag-and-drop-to-a-powershell-script

    • Изменено MoxFulder 17 мая 2013 г. 6:22
    • Помечено в качестве ответа KazunEditor 17 мая 2013 г. 6:42

Все ответы

  • $RegPath = "Registry::HKLM\Software\Classes\*\Shell\Help With PDF\command"

    $RegValue = "C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -nologo -noninteractive -noprofile -command C:\myscript.ps1 '%1'"

    New-Item -Path $RegPath -Force

    New-ItemProperty -Path $RegPath -Name "(Default)" -Value $RegValue


    Отвечающий
  • $RegPath = "Registry::HKLM\Software\Classes\*\Shell\Help With PDF\command"

    $RegValue = "C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -nologo -noninteractive -noprofile -command C:\myscript.ps1 '%1'"

    New-Item -Path $RegPath -Force

    New-ItemProperty -Path $RegPath -Name "(Default)" -Value $RegValue


    Спасибо! А возможно, как-то передать имена сразу нескольких выделенных файлов в один сеанс скрипта (кроме варианта прописать контекстное меню к родительской папке с пдф файлами и потом уже в скрипте дёргать из неё нужное)?

    При текущем способе при выделении нескольких файлов их имена передаются по одному в отдельный экземпляр скрипта.

  • Нашёл обходное решение: Выделяются нужные файлы и правым кликом выбирается меню Отправить в (прямой ярлык на скрипт, без всяких параметров). После чего запускается скрипт в единственном экземпляре и принимает полные пути всех выделенных файлов.

    Делается следующим образом: 

    1. Добавляем два значения в реестр:

    HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\ShellEx\DropHandler\ (Default) = {60254CA5-953B-11CF-8C96-00AA00B8708C}

    Включается возможность перетаскивать любые файлы на скрипты поувершела. (в нашем случае скрипт будет таким образом ловить полные пути к файлам)

    HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command\
    (Default) = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -File "%1" %*

    Этот ключ уже есть в системе, по умолчанию он ссылается на notepad.exe. Все ps файлы "по двойному клику" будут сразу выполняться, а не открываться как раньше в блокноте.

    2. Кидаем ярлык на наш скрипт, который будет ловить файлы в качестве параметров в меню Send To (в Win7, Win8 папка C:\Users\<User Name>\AppData\Roaming\Microsoft\Windows\SendTo)

    3. В скрипте вытаскиваем полные пути всех файлов из встроенной переменной $args в виде массива строк.

    Подробнее можно почитать тут: http://stackoverflow.com/questions/2819908/drag-and-drop-to-a-powershell-script

    • Изменено MoxFulder 17 мая 2013 г. 6:22
    • Помечено в качестве ответа KazunEditor 17 мая 2013 г. 6:42