none
запуск программы через Powershell (нужна помощь) RRS feed

  • Вопрос

  • Нужна помощь в написании скрипта (хотя бы направление где почтать \ посмотреть \ примеры)

    Скрипт должен уметь делать следующее:

    1) есть файлы вида:
    example.exm
     !example.exm

    2) есть программа в которой есть шаблон открытия файла
    проблема в программе путь к шаблону прописывается в настройках и содржится в ветке реестра  

    что надо сделать:

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

    интересно в основном то... как сделать так что бы скрипт увидел каким файлом он запущен?

    29 января 2014 г. 11:40

Ответы

  • Так стало понятно.

    1) Делаем ассоциацию с расширением

    FTYPE EXM="%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -nologo -noprofile -file "C:\script.ps1" %1 
    ASSOC .EXM=EXM

    2) Где C:\script.ps1

    param($file)
    
    $file = Split-Path $file -Leaf
    
    switch($file)
    {
    	"example.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 1}
    	"!example.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 2}
    }
    PS. ftype и assoc лучше выполнить в cmd,если в powershell,то добавить вперед cmd /c ftype



    • Изменено KazunEditor 30 января 2014 г. 5:00
    • Помечено в качестве ответа ©LIS®™ 30 января 2014 г. 7:30
    • Снята пометка об ответе ©LIS®™ 31 января 2014 г. 6:27
    • Помечено в качестве ответа ©LIS®™ 4 февраля 2014 г. 10:16
    30 января 2014 г. 4:58
    Отвечающий
  • Ничего странного - аргументы в пакетных файлах %0 %1 %2 и т.д, поэтому и не работает.

    test.cmd

    @echo %1
    @echo %2
    @echo %3

    И запуск:

    PS > .\test.cmd 1 2 3
    1
    2
    3

    • Изменено KazunEditor 31 января 2014 г. 9:49
    • Помечено в качестве ответа ©LIS®™ 4 февраля 2014 г. 10:17
    31 января 2014 г. 9:46
    Отвечающий
  • Взять в кавычки "%1"

    FTYPE EXM="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -nologo -noprofile -file "C:\script.ps1" "%1"

    • Помечено в качестве ответа ©LIS®™ 4 февраля 2014 г. 10:16
    3 февраля 2014 г. 11:53
    Отвечающий

Все ответы

  • Сами понимаете что пишете?

    Если скрипт запускается разными шаблонами,то и передавайте разные параметры скрипту.

    powershell -file C:\script\script.ps1 "example.exm"

    powershell -file C:\script\script.ps1 "!example.exm"

    Сам скрипт для примера:

    param($file)
    
    switch($file)
    {
    	"example.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 1}
    	"!example.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 2}
    }

    29 января 2014 г. 14:43
    Отвечающий
  • я то понимаю) осталось объяснить правильно)

    В общем для примера:

    я хочу привязать расширение файла к скрипту то есть что бы при запуске *.exm запускалось не приложение а скрипт (в принципе для PS это возможно). после запуска файла, скрипт должен запуститься и понять какой файл его запустил с восклицательным знаком или без и соответственно от этого понятия вставил нужный параметр для настройки программы в реестр, а после этого уже этой программой открыл этот самый файл.

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

    Спасибо за ответ в любом случае сейчас попробую ваш вариант вдруг он это и подразумевает)

    29 января 2014 г. 23:40
  • Так стало понятно.

    1) Делаем ассоциацию с расширением

    FTYPE EXM="%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -nologo -noprofile -file "C:\script.ps1" %1 
    ASSOC .EXM=EXM

    2) Где C:\script.ps1

    param($file)
    
    $file = Split-Path $file -Leaf
    
    switch($file)
    {
    	"example.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 1}
    	"!example.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 2}
    }
    PS. ftype и assoc лучше выполнить в cmd,если в powershell,то добавить вперед cmd /c ftype



    • Изменено KazunEditor 30 января 2014 г. 5:00
    • Помечено в качестве ответа ©LIS®™ 30 января 2014 г. 7:30
    • Снята пометка об ответе ©LIS®™ 31 января 2014 г. 6:27
    • Помечено в качестве ответа ©LIS®™ 4 февраля 2014 г. 10:16
    30 января 2014 г. 4:58
    Отвечающий
  • Спасибо большое! Завтра буду пробовать, сегодня так и не дали побаловаться с этой проблемой :(
    30 января 2014 г. 7:30
  • Попробовал данный способ: не вышло =(

    1й скрипт пролил батничком файлик прицепился к скрипту

    2й скрипт ругается на то что -Path равен Null то есть пустой

    если 2й скрипт представить как:

    param($file)
    write-host $file

    то при запуске файлика example.exm в командной строке выводится пустая строка.

    если 2й скрипт представить как:
     $file = 1
    write-host $file
    то при запуске файлика example.exm в командной строке выводится данные "1".

    все это говорит мне о том что имя запускаемого файла не попадает в переменную $file
    а должно быть примерно так
    запуск 
    example.exm -> запускается скрипт -> в скрипте есть переменная $file которой присваивается значение example.exm -> после этого происходит анализ названия, если в названии присутствует восклицательный знак то делает одно действие, если отсутствует то делается другое действие.
    в моем случае переменной $file ничего не присваивается =( то ли снег то ли лыжи)) 


    31 января 2014 г. 6:36
  • Проверить ассоциацию файлов, есть подозрение  - что оно не верно.

    Добавить -noexit, чтоб окно PowerShell не закрывалось:

    FTYPE EXM="%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -noexit -nologo -noprofile -file "С:\script.ps1" %1
    И привести результат, при двойном нажатии на файл.

    31 января 2014 г. 7:38
    Отвечающий
  • кажется разобрался) в понедельник уже теперь точно проверю...
    почему то когда команда
    FTYPE EXM="%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -noexit -nologo -noprofile -file "С:\script.ps1" %1
    запускается через файлик test1.cmd то %1 не прописывается... если %1 взять в кавычки то в строке прописываются только кавычки... если самому ручками прописать в cmd эти команды, все начинает работать... странно это :\

    C:\>test1.cmd
    
    C:\>FTYPE EXM="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noexi
    t -nologo -noprofile -file "C:\test1.ps1"
    EXM="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noexit -nologo
    -noprofile -file "C:\test1.ps1"
    
    C:\>ASSOC .EXM=EXM
    .EXM=EXM

    31 января 2014 г. 9:42
  • Ничего странного - аргументы в пакетных файлах %0 %1 %2 и т.д, поэтому и не работает.

    test.cmd

    @echo %1
    @echo %2
    @echo %3

    И запуск:

    PS > .\test.cmd 1 2 3
    1
    2
    3

    • Изменено KazunEditor 31 января 2014 г. 9:49
    • Помечено в качестве ответа ©LIS®™ 4 февраля 2014 г. 10:17
    31 января 2014 г. 9:46
    Отвечающий
  • Ничего странного - аргументы в пакетных файлах %0 %1 %2 и т.д, поэтому и не работает.

    Ну теперь вроде уже точно все понятно)  Теперь останется допилить скрипт) единственно мучает вопрос) пока еще не пробовал (может когда попробую все станет ясно)
    если заменить
    { "*.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 1}
    "!*.exm" {Set-ItemProperty -Path HKCU:\WXP -Name MyOption -Value 2}
    }

    скорее всего начнутся проблемы с тем что *.exm по идее включает в себя и !*.exm, но это уже наверно будет легче решить)
    спасибо Вам!

    31 января 2014 г. 10:04
  • switch -wildcard ($file)
    {
    	"!*.exm" {write-host "XXX";break}
    	"*.exm" {write-host "BBB";break}
    }

    31 января 2014 г. 10:09
    Отвечающий
  • В общем все проверил все работает) осталось решить ну совсем маленькую (или очень большую проблему)

    переменная $file если нужный файл сохранить по пути c:\documents and settings\user\рабочий стол\example.exm принимает почему то вид как c:\documents and settings\user\рабочий стол\example.exm
    и соответственно при написании строки
    для запуска в нужной программе 
    .\example.exe $file 

    вывод происходит как c:\Documents
    :(

    2 февраля 2014 г. 22:55
  • В общем все проверил все работает) осталось решить ну совсем маленькую (или очень большую проблему)

    переменная $file если нужный файл сохранить по пути c:\documents and settings\user\рабочий стол\example.exm принимает почему то вид как c:\documents and settings\user\рабочий стол\example.exm
    и соответственно при написании строки
    для запуска в нужной программе 
    .\example.exe $file 

    вывод происходит как c:\Documents
    :(

    Для получения имя файла: $file = Split-Path $file -Leaf
    3 февраля 2014 г. 4:44
    Отвечающий
  • Для получения имя файла: $file = Split-Path $file -Leaf

    Немного обманул) 

    param($file)
    $file = Split-Path $file -Leaf

    в итоге выдает c:\Documents то есть виной всему пробел) это я уже чуть позже просто заметил :)

    3 февраля 2014 г. 11:40
  • Взять в кавычки "%1"

    FTYPE EXM="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -nologo -noprofile -file "C:\script.ps1" "%1"

    • Помечено в качестве ответа ©LIS®™ 4 февраля 2014 г. 10:16
    3 февраля 2014 г. 11:53
    Отвечающий
  • Все) все проверил, все работает) спасибо вам большое) теперь надо что то про работу с фтп найти и сертифкатами и все будет вообще клево))

    4 февраля 2014 г. 10:15