Есть ли способ заставить скрипт powershell работать, дважды щелкнув файл.ps1?
я распространяю сценарий Powershell для своей команды. Сценарий должен получить IP-адрес от клиента Vsphere, сделать соединение mstsc и зарегистрировать его в общем файле.
в тот момент, когда они использовали скрипт, они узнали IP-адрес машины.
После этого они всегда стремятся использовать mstsc напрямую вместо запуска сценария powershell.
(Поскольку они используют mstsc, я не могу знать, Часто ли они используют виртуальную машину или нет)
в основном они говорят мне, что запуск powershell не является прямым.
меня тошнит от их лени.
есть какой-нибудь способ заставить работать скрипт PowerShell с помощью двойного щелчка .файл PS1?
17 ответов:
создать ярлык с чем-то вроде этого в качестве "цели":
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 файлы, как вы хотели бы. по моему скромному мнению, уметь выходить из коробки.
Я собираюсь назвать это "Powershell де-кастрация Хак". Лол наслаждайтесь!
Я написал это несколько лет назад (запустить его с правами администратора):
<# .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 {} }
имейте в виду, что одной из функций безопасности PowerShell является то, что пользователи не могут запускать скрипт с двойным щелчком мыши. Будьте очень осторожны при изменении этого параметра. Альтернативой может быть упаковка вашего скрипта. Некоторые редакторы, такие как PrimalScript, могут это сделать. Пользователи по-прежнему нуждаются в установке PowerShell, а затем они могут дважды щелкните исполняемый файл. И похоже, что ваша команда нуждается в небольшом образовании.
Я согласен, что установка системного параметра может быть немного много, но ярлык, требующий жестко закодированного пути, не идеален. Файл BAT на самом деле решает проблему красиво
RunMyPowershellScript.летучая мышь
start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"этот пакетный файл теперь можно дважды щелкнуть на, ярлыки могут быть легко созданы в пакетный файл и сценарий может быть развернут в любую папку.
вам нужно будет настроить реестр. Во-первых, настроить PSDrive для HKEY_CLASSES_ROOT, так как это не настроено по умолчанию. Команда для этого:
вы можете перемещаться и изменять ключи и значения реестра в HKEY_CLASSES_ROOT так же, как и в обычной в HKCU и в HKLM диски.New-PSDrive HKCR Registry HKEY_CLASSES_ROOTчтобы настроить двойной щелчок для запуска сценариев PowerShell напрямую:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0чтобы настроить двойной щелчок для открытия сценариев PowerShell в PowerShell Исэ:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'чтобы восстановить значение по умолчанию (устанавливает двойной щелчок, чтобы открыть сценарии PowerShell в блокноте):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'
это работало для меня на Windows 10 и powershell 5.1:
- щелкните правой кнопкой мыши на файле. ps1
- открыть с помощью...
- выбрать другое приложение
- скопируйте расположение powershell.exe в адресной строке (по умолчанию он не будет показывать папку windows) т. е. C:\Windows\System32\WindowsPowerShell\v1.0
- выберите powershell.exe
- выберите "Всегда использовать это приложение, чтобы открыть. ps1 файлы"
- нажмите кнопку ОК
- перейдите к REGEDIT HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
- в правой панели дважды щелкните "(по умолчанию)"
- удалите существующее значение " Open "(которое запускает блокнот) и введите" 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"'
поставить простой .cmd-файл в моей подпапке с моим файлом. ps1 с тем же именем, поэтому, например, сценарий с именем "foobar" будет иметь "foobar.ps1" и "foobar.УМК." Поэтому, чтобы запустить. 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= pausepushd / popd позволяет запустить .файл cmd из командной строки без необходимо перейти в определенный каталог, в котором находятся скрипты. Он изменится на каталог сценария, а затем, когда он будет завершен, вернется в исходный каталог.
вы также можете снять паузу, если хотите, чтобы командное окно исчезло после завершения сценария.
Если мой сценарий. ps1 имеет параметры, я запрашиваю их с помощью GUI-запросов с использованием форм .NET, но также делаю скрипты достаточно гибкими, чтобы принимать параметры, если я хочу передать их вместо этого. Таким образом, я можно просто дважды щелкнуть его из Проводника и не знать подробностей параметров, так как он попросит меня о том, что мне нужно, со списками или другими формами.
Если вы знакомы с расширенным администрированием Windows, то вы можете использовать этот пакет ADM (инструкции включены на этой странице) и позволяют запускать сценарии PS после двойного щелчка через этот шаблон и локальный объект групповой политики. После этого вы можете просто изменить программу по умолчанию, связанную с. ps1 filetype на
powershell.exe(используйте поиск, он довольно спрятан), и вы готовы запускать сценарии PS с двойным щелчком мыши.в противном случае я бы рекомендовал придерживаться другие предложения вы можете испортить всю систему с помощью этих инструментов администраций.
Я думаю, что настройки по умолчанию слишком строги. Если кому-то удается поместить какой-то вредоносный код на ваш компьютер, он также может обойти это ограничение (обернуть его .файл cmd или .exe, или трюк с ярлыком), и все, что он в конце концов выполняет, - это просто помешать вам легко запустить сценарий, который вы написали.
Это то, что я использую для запуска скриптов от имени администратора по умолчанию:
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"""''}"')
вы можете использовать функцию Windows "SendTo", чтобы упростить запуск сценариев PS1. Используя этот метод, вы можете щелкнуть правой кнопкой на в PS1 и выполнить. Это не совсем ответ на вопрос OP, но он близок. Надеюсь, это полезно для других. КСТАТИ.. это полезно для множество других задач.
- Поиск / поиска для PowerShell.exe
- щелкните правой кнопкой мыши на Powershell.exe и выберите Открыть расположение файла
- Правой Кнопкой Мыши на В PowerShell.exe и выберите Создать Ярлык. Временно сохраните какое-то место, как ваш рабочий стол
- вы можете открыть как администратор по умолчанию. Выберите Ярлык > Свойства > Дополнительно > Открыть Как Администратор
- откройте папку Sendto. Пуск > Выполнить > Оболочка: Sendto
- переместить Powershell.exe ярлык для папки Sendto
- Теперь вы можете щелкнуть правой кнопкой мыши на сценарии PS1.
- щелкните правой кнопкой мыши на файл PS1, выберите контекстное меню "Отправить" > Выберите ярлык Powershell
- ваш сценарий PS1 должен выполняться.
Я использовал это: (нужно, чтобы запустить его только один раз) также убедитесь, что у вас есть права на выполнение:
из PowerShell с повышенными правами: Set-ExecutionPolicy=RemoteSigned
затем из файла bat
ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe "- noexit ^& '%%1'
ассоц .пс1=Майкрософт.PowerShellScript.1
автоматический выход: удалить -noexit
и вуаля. дважды в *.PS1 будут выполнять.
это основано на ответе KoZm0kNoT. Я изменил его для работы на разных дисках.
@echo off pushd "%~d0" pushd "%~dp0" powershell.exe -sta -c "& {.\%~n0.ps1 %*}" popd popdдве команды pushd/popds необходимы в случае, если текущий рабочий каталог пользователя находится на другом диске. Без внешнего набора cwd на диске со скриптом будет потерян.
вы можете установить ассоциацию файлов по умолчанию
ps1файлыpowershell.exeчто позволит вам выполнить сценарий powershell, дважды щелкнув по нему.В Windows 10,
- щелкните правой кнопкой мыши
ps1file- клик
Open with- клик
Choose another app- во всплывающем окне выберите
More apps- прокрутите вниз и выберите
Look for another app on this PC.- выберите
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.- элемент списка
это изменит ассоциацию файлов и
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
Comments