Есть ли способ заставить скрипт PowerShell работать, дважды щелкнув файл .ps1?

Я распространяю сценарий PowerShell для своей команды. Сценарий предназначен для получения IP-адреса от клиента Vsphere, установления соединения mstsc и регистрации его в общем файле.

В тот момент, когда они использовали скрипт, они узнали IP-адрес компьютера. После этого они всегда склонны использовать mstsc напрямую вместо запуска сценария PowerShell. (Поскольку они используют mstsc, я не могу знать, часто ли они используют виртуальную машину или нет.)

В основном они говорят мне, что запуск PowerShell не прост.

Меня тошнит от их лени.

Есть ли способ заставить скрипт PowerShell работать, дважды щелкнув файл .ps1?

Ответ 1

Создайте ярлык с чем-то вроде этого как "Цель":

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"

Ответ 2

Или, если вы хотите, чтобы все файлы PS1 работали так, как это делают файлы VBS, вы можете редактировать реестр следующим образом:

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command

Измените значение по умолчанию так, чтобы оно было...

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"

Затем вы можете просто дважды щелкнуть все ваши файлы .PS1, как вы хотели бы. по моему скромному мнению, быть в курсе.

Я собираюсь назвать это "The Powershell De-castration Hack". LOL наслаждайтесь!

Ответ 3

Помните, что одна из функций безопасности PowerShell заключается в том, что пользователи не могут запускать script с двойным щелчком. Будьте осторожны, если вы измените эту настройку. Альтернативой может быть упаковка вашего script. Некоторые редакторы, такие как PrimalScript, могут это сделать. Пользователям по-прежнему необходимо установить PowerShell, но затем они могут дважды щелкнуть EXE. И это звучит так, как будто ваша команда нуждается в небольшом образовании.

Ответ 4

Я написал это несколько лет назад (запустите его с правами администратора):

<#
.SYNOPSIS
    Change the registry key in order that double-clicking on a file with .PS1 extension
    start its execution with PowerShell.
.DESCRIPTION
    This operation bring (partly) .PS1 files to the level of .VBS as far as execution
    through Explorer.exe is concern.
    This operation is not advised by Microsoft.
.NOTES
    File Name   : ModifyExplorer.ps1
    Author      : J.P. Blanc - [email protected]
    Prerequisite: PowerShell V2 on Vista and later versions.
    Copyright 2010 - Jean Paul Blanc/Silogix
.LINK
    Script posted on:
    http://www.silogix.fr
.EXAMPLE
    PS C:\silogix> Set-PowAsDefault -On
    Call Powershell for .PS1 files.
    Done!
.EXAMPLE
    PS C:\silogix> Set-PowAsDefault
    Tries to go back
    Done!
#>
function Set-PowAsDefault
{
  [CmdletBinding()]
  Param
  (
    [Parameter(mandatory=$false, ValueFromPipeline=$false)]
    [Alias("Active")]
    [switch]
    [bool]$On
  )

  begin
  {
    if ($On.IsPresent)
    {
      Write-Host "Call PowerShell for .PS1 files."
    }
    else
    {
      Write-Host "Try to go back."
    }
  }

  Process
  {
    # Text Menu
    [string]$TexteMenu = "Go inside PowerShell"

    # Text of the program to create
    [string] $TexteCommande = "%systemroot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command ""&'%1'"""

    # Key to create
    [String] $clefAModifier = "HKLM:\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\Open\Command"

    try
    {
      $oldCmdKey = $null
      $oldCmdKey = Get-Item $clefAModifier -ErrorAction SilentlyContinue
      $oldCmdValue = $oldCmdKey.getvalue("")

      if ($oldCmdValue -ne $null)
      {
        if ($On.IsPresent)
        {
          $slxOldValue = $null
          $slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
          if ($slxOldValue -eq $null)
          {
            New-ItemProperty $clefAModifier -Name "slxOldValue" -Value $oldCmdValue  -PropertyType "String" | Out-Null
            New-ItemProperty $clefAModifier -Name "(default)" -Value $TexteCommande  -PropertyType "ExpandString" | Out-Null
            Write-Host "Done !"
          }
          else
          {
            Write-Host "Already done!"
          }
        }
        else
        {
          $slxOldValue = $null
          $slxOldValue = Get-ItemProperty $clefAModifier -Name "slxOldValue" -ErrorAction SilentlyContinue
          if ($slxOldValue -ne $null)
          {
            New-ItemProperty $clefAModifier -Name "(default)" -Value $slxOldValue."slxOldValue"  -PropertyType "String" | Out-Null
            Remove-ItemProperty $clefAModifier -Name "slxOldValue"
            Write-Host "Done!"
          }
          else
          {
            Write-Host "No former value!"
          }
        }
      }
    }
    catch
    {
      $_.exception.message
    }
  }
  end {}
}

Ответ 5

Я согласен с тем, что установка системных настроек может быть немного, но ярлык, требующий жесткого пути, не идеален. Файл bat действительно решает проблему красиво

RunMyPowershellScript.bat

 start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"

Теперь этот командный файл можно дважды щелкнуть, ярлыки можно легко создать в пакетном файле, а script можно развернуть в любую папку.

Ответ 6

Вам нужно будет настроить реестр. Сначала настройте PSDrive для HKEY_CLASSES_ROOT, так как по умолчанию это не установлено. Команда для этого:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

Теперь вы можете перемещаться и редактировать разделы реестра и значения в HKEY_CLASSES_ROOT так же, как в обычных HKCU и HKLM PSDrives.

Чтобы настроить двойной щелчок, чтобы запустить скрипты PowerShell напрямую:

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0

Чтобы настроить двойной щелчок, чтобы открыть сценарии PowerShell в PowerShell ISE:

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'

Чтобы восстановить значение по умолчанию (устанавливает двойной щелчок, чтобы открыть сценарии PowerShell в Блокноте):

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'

Ответ 7

Это работало для меня в Windows 10 и powershell 5.1:

  • щелкните правой кнопкой мыши на файле .ps1
  • Открыть с помощью...
  • Выберите другое приложение.
  • Скопируйте расположение файла powershell.exe в адресную строку (по умолчанию он не будет отображать папку Windows), то есть C:\Windows\System32\WindowsPowerShell\v1.0
  • выберите powershell.exe
  • выберите "Всегда использовать это приложение для открытия файлов .ps1"
  • нажмите "ОК"

Ответ 8

Простые команды PowerShell, чтобы установить это в реестре;

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
Set-ItemProperty -Path "HKCR:\Microsoft.PowerShellScript.1\Shell\open\command" -name '(Default)' -Value '"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"'

Ответ 9

  • Перейдите к REGEDIT в HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
  • На правой панели дважды щелкните "(по умолчанию)"
  • Удалить существующее значение "Открыть" (которое запускает "Блокнот" ) и ввести "0" (ноль, который запускает Powershell напрямую).

Отмените значение, если вы хотите снова использовать Notepad.

Ответ 10

поместите простой .cmd файл в мою подпапку с моим .ps1 файлом с тем же именем, поэтому, например, script с именем "foobar" будет иметь "foobar.ps1" и "foobar.cmd". Поэтому для запуска .ps1 все, что мне нужно сделать, это щелкнуть файл .cmd из проводника или запустить .cmd из командной строки. Я использую одно и то же базовое имя, потому что .cmd файл будет автоматически искать .ps1, используя свое собственное имя.

::====================================================================
:: Powershell script launcher
::=====================================================================
:MAIN
    @echo off
    for /f "tokens=*" %%p in ("%~p0") do set SCRIPT_PATH=%%p
    pushd "%SCRIPT_PATH%"

    powershell.exe -sta -c "& {.\%~n0.ps1 %*}"

    popd
    set SCRIPT_PATH=
    pause

Pushd/popd позволяет запускать .cmd файл из командной строки без необходимости изменения в конкретном каталоге, где расположены скрипты. Он изменится на каталог script, после чего верните его в исходный каталог.

Вы также можете отключить паузу, если вы хотите, чтобы окно команды исчезло при завершении script.

Если у моего .ps1 script есть параметры, я запрашиваю их с подсказками GUI с использованием .NET Forms, но также делаю скрипты достаточно гибкими, чтобы принимать параметры, если я хочу их передать. Таким образом, я могу просто дважды щелкнуть по нему из Explorer и не знать подробностей параметров, так как он спросит меня, что мне нужно, со списками или другими формами.

Ответ 11

Если вы знакомы с расширенным администрированием Windows, вы можете использовать этот пакет ADM (инструкции приведены на этой странице) и разрешить запуск сценариев PowerShell после двойного щелчка по этому шаблону и локальному объекту групповой политики. После этого вы можете просто изменить программу по умолчанию, связанную с типом файла .ps1, на powershell.exe (используйте powershell.exe поиска, она довольно спрятана), и вы готовы запускать сценарии PowerShell двойным щелчком мыши.

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

Я думаю, что настройки по умолчанию слишком строги. Если кому-то удастся разместить вредоносный код на вашем компьютере, он/она также сможет обойти это ограничение (обернуть его в файл .cmd или .exe, или использовать ярлык с ярлыком), и все, что он, в конце концов, выполняет, это только предотвращает Вы от простого способа запустить сценарий, который вы написали.

Ответ 12

Это основано на ответе KoZm0kNoT. Я изменил его для работы с дисками.

@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {.\%~n0.ps1 %*}"
popd
popd

Два pushd/popds необходимы, если пользовательский cdd находится на другом диске. Без внешнего набора, cwd на диске с script будет потерян.

Ответ 13

Это то, что я использую для запуска скриптов по умолчанию как admin:

Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList '-File """%1"""'}"

Вам нужно вставить это в regedit как значение по умолчанию для:

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command

Или здесь script, который сделает это за вас:

$hive = [Microsoft.Win32.RegistryKey]::OpenBaseKey('ClassesRoot', 'Default')
$key = $hive.CreateSubKey('Microsoft.PowerShellScript.1\Shell\Open\Command')
$key.SetValue($null, 'Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList ''-File """%1"""''}"')

Ответ 14

Вы можете использовать функциональность "SendTo" Windows, чтобы упростить выполнение сценариев PS1. Используя этот метод, вы можете щелкнуть правой кнопкой мыши PS1 script и выполнить. Это точно не отвечает на вопрос ОП, но он близок. Надеюсь, это полезно для других. BTW.. это полезно для множество других задач.

  • Найти/Поиск Powershell.exe
  • Щелкните правой кнопкой мыши на Powershell.exe и выберите Open File Location
  • Щелкните правой кнопкой мыши на Powershell.exe и выберите "Создать ярлык". Временно сохраните место, например, рабочий стол.
  • Вы можете открыть как Admin по умолчанию. Выберите Ярлык > Свойствa > Дополнительно > Открыть как Admin
  • Откройте папку Sendto. Пуск > Выполнить > Оболочка: Отправить
  • Переместите ярлык Powershell.exe в папку Sendto
  • Теперь вы можете щелкнуть правой кнопкой мыши по PS1 script.
  • Щелкните правой кнопкой мыши на файле PS1, выберите параметр контекста SendTo > Выберите ярлык Powershell
  • Ваш PS1 script должен выполнить.

Ответ 15

Я использовал это (нужно запустить его только один раз); также убедитесь, что у вас есть права на выполнение:

из PowerShell с повышенными правами:

Set-ExecutionPolicy=RemoteSigned

затем из файла bat:

-----------------------------------------

 ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit ^&'%%1'

 assoc .ps1=Microsoft.PowerShellScript.1

-----------------------------------------
auto exit: remove -noexit 

и вуаля; двойной щелчок *.ps1 запустит его.

Ответ 16

Вы можете установить ассоциацию файлов по умолчанию для файлов ps1 как powershell.exe что позволит вам выполнить скрипт powershell, дважды щелкнув по нему.

В Windows 10

  1. Щелкните правой кнопкой мыши на файле ps1
  2. Нажмите Open with
  3. Нажмите Choose another app
  4. Во всплывающем окне выберите " More apps
  5. Прокрутите вниз и выберите Look for another app on this PC.
  6. Найдите и выберите C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.
  7. Элемент списка

Это изменит ассоциацию файлов, и файлы ps1 будут выполнены, дважды щелкнув по ним. Вы можете изменить его на поведение по умолчанию, установив notepad.exe в приложение по умолчанию.

Источник

Ответ 17

В Windows 10 вы также можете удалить переопределение проводника Windows для ассоциации расширений файлов:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice

в дополнение к изменению команды HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command упомянутому в других ответах.

См. fooobar.com/questions/149436/...