Ответ 1
Создайте ярлык с чем-то вроде этого как "Цель":
powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
Я распространяю сценарий PowerShell для своей команды. Сценарий предназначен для получения IP-адреса от клиента Vsphere, установления соединения mstsc и регистрации его в общем файле.
В тот момент, когда они использовали скрипт, они узнали IP-адрес компьютера. После этого они всегда склонны использовать mstsc напрямую вместо запуска сценария PowerShell. (Поскольку они используют mstsc, я не могу знать, часто ли они используют виртуальную машину или нет.)
В основном они говорят мне, что запуск PowerShell не прост.
Меня тошнит от их лени.
Есть ли способ заставить скрипт PowerShell работать, дважды щелкнув файл .ps1?
Создайте ярлык с чем-то вроде этого как "Цель":
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 наслаждайтесь!
Помните, что одна из функций безопасности PowerShell заключается в том, что пользователи не могут запускать script с двойным щелчком. Будьте осторожны, если вы измените эту настройку. Альтернативой может быть упаковка вашего script. Некоторые редакторы, такие как PrimalScript, могут это сделать. Пользователям по-прежнему необходимо установить PowerShell, но затем они могут дважды щелкнуть EXE. И это звучит так, как будто ваша команда нуждается в небольшом образовании.
Я написал это несколько лет назад (запустите его с правами администратора):
<#
.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 {}
}
Я согласен с тем, что установка системных настроек может быть немного, но ярлык, требующий жесткого пути, не идеален. Файл bat действительно решает проблему красиво
RunMyPowershellScript.bat
start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"
Теперь этот командный файл можно дважды щелкнуть, ярлыки можно легко создать в пакетном файле, а script можно развернуть в любую папку.
Вам нужно будет настроить реестр. Сначала настройте 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'
Это работало для меня в Windows 10 и powershell 5.1:
Простые команды 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"'
Отмените значение, если вы хотите снова использовать Notepad.
поместите простой .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 и не знать подробностей параметров, так как он спросит меня, что мне нужно, со списками или другими формами.
Если вы знакомы с расширенным администрированием Windows, вы можете использовать этот пакет ADM (инструкции приведены на этой странице) и разрешить запуск сценариев PowerShell после двойного щелчка по этому шаблону и локальному объекту групповой политики. После этого вы можете просто изменить программу по умолчанию, связанную с типом файла .ps1, на powershell.exe
(используйте powershell.exe
поиска, она довольно спрятана), и вы готовы запускать сценарии PowerShell двойным щелчком мыши.
В противном случае, я бы порекомендовал придерживаться других предложений, так как вы можете испортить всю систему с помощью этих инструментов администрирования.
Я думаю, что настройки по умолчанию слишком строги. Если кому-то удастся разместить вредоносный код на вашем компьютере, он/она также сможет обойти это ограничение (обернуть его в файл .cmd или .exe, или использовать ярлык с ярлыком), и все, что он, в конце концов, выполняет, это только предотвращает Вы от простого способа запустить сценарий, который вы написали.
Это основано на ответе KoZm0kNoT. Я изменил его для работы с дисками.
@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {.\%~n0.ps1 %*}"
popd
popd
Два pushd/popds необходимы, если пользовательский cdd находится на другом диске. Без внешнего набора, cwd на диске с script будет потерян.
Это то, что я использую для запуска скриптов по умолчанию как 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"""''}"')
Вы можете использовать функциональность "SendTo" Windows, чтобы упростить выполнение сценариев PS1. Используя этот метод, вы можете щелкнуть правой кнопкой мыши PS1 script и выполнить. Это точно не отвечает на вопрос ОП, но он близок. Надеюсь, это полезно для других. BTW.. это полезно для множество других задач.
Я использовал это (нужно запустить его только один раз); также убедитесь, что у вас есть права на выполнение:
из 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 запустит его.
Вы можете установить ассоциацию файлов по умолчанию для файлов ps1
как powershell.exe
что позволит вам выполнить скрипт powershell, дважды щелкнув по нему.
В Windows 10
ps1
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
в приложение по умолчанию.
В Windows 10 вы также можете удалить переопределение проводника Windows для ассоциации расширений файлов:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
в дополнение к изменению команды HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
упомянутому в других ответах.
Из http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily:
Задайте значение по умолчанию для HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell
: 0