我正在向我的团队分发一个PowerShell脚本。该脚本从Vsphere客户端获取一个IP地址,建立一个mstsc连接,并将其记录在共享文件中。
他们一使用脚本就知道了机器的IP地址。在此之后,他们总是倾向于直接使用mstsc,而不是运行PowerShell脚本。 (因为他们正在使用mstsc,我不知道他们是否经常使用VM。)
他们主要告诉我,运行PowerShell并不简单。
我对他们的懒惰感到厌恶。
是否有一种方法可以通过双击.ps1文件来使PowerShell脚本工作?
我正在向我的团队分发一个PowerShell脚本。该脚本从Vsphere客户端获取一个IP地址,建立一个mstsc连接,并将其记录在共享文件中。
他们一使用脚本就知道了机器的IP地址。在此之后,他们总是倾向于直接使用mstsc,而不是运行PowerShell脚本。 (因为他们正在使用mstsc,我不知道他们是否经常使用VM。)
他们主要告诉我,运行PowerShell并不简单。
我对他们的懒惰感到厌恶。
是否有一种方法可以通过双击.ps1文件来使PowerShell脚本工作?
当前回答
从http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily:
为HKEY_CLASSES_ROOT\Microsoft.PowerShellScript设置默认值。1\Shell到0
其他回答
这是我默认以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"""''}"')
如果你熟悉高级Windows管理,那么你可以使用这个ADM包(说明包括在那个页面上),并允许通过这个模板和本地GPO双击后运行PowerShell脚本。在此之后,您可以简单地将与.ps1文件类型相关联的默认程序更改为PowerShell .exe(使用搜索,它是相当隐藏的),并且您已经准备好双击运行PowerShell脚本。
否则,我建议坚持使用其他建议,因为使用这些管理工具可能会搞乱整个系统。
我认为默认设置太严格了。如果有人设法在你的计算机上放置一些恶意代码,那么他/她也能够绕过这个限制(将其包装成.cmd文件或.exe,或带有快捷方式的技巧),而它最终所实现的只是阻止你以简单的方式运行你所编写的脚本。
您可以将ps1文件的默认文件关联设置为powershell.exe,这将允许您通过双击它来执行powershell脚本。
在Windows 10中,
右键单击ps1文件 单击“打开” 点击选择另一个应用程序 在弹出窗口中,选择“更多应用程序” 滚动到底部,选择“在这台PC上寻找另一个应用程序”。 浏览并选择C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。 列表项
这将改变文件关联,ps1文件将通过双击它们来执行。通过将notepad.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 - jean-paul_blanc@silogix-fr.com
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 {}
}
在我的子文件夹中放一个简单的.cmd文件和同名的.ps1文件,例如,一个名为“foobar”的脚本会有“foobar. exe”。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脚本有参数,我会使用. net Forms使用GUI提示来提示它们,但也要使脚本足够灵活,以便在我想要传递参数时接受参数。这样我就可以从资源管理器中双击它,而不必知道参数的详细信息,因为它会用列表框或其他形式询问我需要什么。