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

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

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

В основном они говорят мне, что бегущая сила не прямолинейна.

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

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

Создайте ярлык с чем-то вроде этого как «objective»:

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

Или, если вы хотите, чтобы все файлы 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 нравится!

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

 <# .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 : JP 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 {} } 

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

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

RunMyPowershellScript.bat

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

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

Вам нужно будет настроить реестр. Во-первых, настройте 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' 
  1. Переместите REGEDIT в HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Microsoft.PowerShellScript.1 \ Shell
  2. На правой панели дважды щелкните “(по умолчанию)”
  3. Удалите существующее значение «Открыть» (которое запускает «Блокнот») и введите «0» (ноль, который запускает Powershell напрямую).

Верните значение, если вы хотите снова использовать Блокнот.

Простые команды 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"' 

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

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

поместите простой .cmd-файл в мою подпапку с моим .ps1-файлом с тем же именем, так, например, для скрипта с именем 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-файл из командной строки без необходимости изменения в конкретном каталоге, где находятся скрипты. Он изменится на каталог сценария, а затем, когда он вернется в исходный каталог.

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

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

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

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

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

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

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

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

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

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

 $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"""''}"') 

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

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

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

из powershell с повышенными правами: Set-ExecutionPolicy = RemoteSigned

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


ftype Microsoft.PowerShellScript.1 = “C: \ WINDOWS \ system32 \ windowspowershell \ v1.0 \ powershell.exe” -noexit ^ & ‘%% 1’

assoc .ps1 = Microsoft.PowerShellScript.1


автоматический выход: remove -noexit

и вуаля. doubleclick a * .ps1 будет выполняться.

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

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

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

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

В Windows 10,

  1. Щелкните правой кнопкой ps1 файл 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 в приложение по умолчанию.

Источник

С http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily :

Установите значение по умолчанию для HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell на 0

  • Каков наилучший способ определения местоположения текущего сценария PowerShell?
  • Как открыть окно оболочки после запуска сценария PowerShell?
  • Получить значение удаленного реестра
  • Рекурсивный поиск файлов с использованием PowerShell
  • Как получить только каталоги с помощью Get-ChildItem?
  • Как включить локально определенную функцию при использовании команды Invoke-Command PowerShell для удаленного доступа?
  • Получение ExitCode с использованием Start-Process и WaitForExit вместо -Wait
  • Как получить контрольную сумму MD5 в PowerShell
  • Использование Invoke-Command -ScriptBlock для функции с аргументами
  • Давайте будем гением компьютера.