我正在向我的团队分发PowerShell脚本。该脚本是要从Vsphere客户端获取IP地址,建立mstsc连接并将其记录在共享文件中。
他们使用脚本的那一刻,他们就知道了机器的IP地址。之后,他们总是倾向于直接使用mstsc而不是运行PowerShell脚本。(由于他们使用的是mstsc,所以我不知道他们是否经常使用VM。)
主要是他们告诉我,运行PowerShell并不简单。
他们的懒惰使我感到恶心。
是否可以通过双击.ps1文件来使PowerShell脚本正常工作?
我正在向我的团队分发PowerShell脚本。该脚本是要从Vsphere客户端获取IP地址,建立mstsc连接并将其记录在共享文件中。
他们使用脚本的那一刻,他们就知道了机器的IP地址。之后,他们总是倾向于直接使用mstsc而不是运行PowerShell脚本。(由于他们使用的是mstsc,所以我不知道他们是否经常使用VM。)
主要是他们告诉我,运行PowerShell并不简单。
他们的懒惰使我感到恶心。
是否可以通过双击.ps1文件来使PowerShell脚本正常工作?
Answers:
创建一个类似以下内容的快捷方式作为“目标”:
powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
-NoProfile
也很有用,因为配置文件可以执行脚本不希望发生的所有事情。
或者,如果您希望所有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”。大声笑享受!
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -File "%1"%*
可以在其中可选地包含注册表项的正确默认值-ExecutionPolicy unrestricted
。请注意命令末尾的更改,该更改允许将零个或多个参数传递到PowerShell脚本。引号和百分号周围的间距应完全如图所示。
ftype Microsoft.PowerShellScript.1=^"^%SystemRoot^%\System32\WindowsPowerShell\v1.0\powershell.exe^" -NoLogo -ExecutionPolicy Unrestricted -File ^"%1^" %*
将完成相同的操作。
请注意,PowerShell的一项安全功能是用户无法双击启动脚本。如果您修改此设置,请格外小心。另一种选择是打包脚本。像PrimalScript这样的编辑器可以做到这一点。用户仍然需要安装PowerShell,但是他们可以双击exe。听起来您的团队需要一点教育。
这在Windows 10和Powershell 5.1上对我有用:
Set-ExecutionPolicy
)。
我几年前写的(用管理员权限运行):
<#
.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 {}
}
您需要调整注册表。首先,为HKEY_CLASSES_ROOT配置PSDrive,因为默认情况下未设置。该命令是:
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
现在,您可以像在常规HKCU和HKLM PSDrives中一样在HKEY_CLASSES_ROOT中导航和编辑注册表项和值。
要配置双击以直接启动PowerShell脚本,请执行以下操作:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0
要配置双击以在PowerShell ISE中打开PowerShell脚本,请执行以下操作:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'
恢复默认值(设置双击以在记事本中打开PowerShell脚本):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'
我同意设置系统设置可能会很多,但是需要硬编码路径的快捷方式并不理想。bat文件实际上很好地解决了问题
RunMyPowershellScript.bat
start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"
现在可以双击该批处理文件,可以轻松地为该批处理文件创建快捷方式,并且可以将脚本部署到任何文件夹。
使用简单的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"'
ExecutionPolicy RemoteSigned
这样一来,从网络/互联网上下载的随机脚本(元数据表示该脚本不是在本地创建的)将不会通过双击执行,但是您通过复制和创建的任何文件将代码粘贴到.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
为默认应用将其恢复为默认行为。
将一个简单的.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
通过push / popd,您可以从命令提示符启动.cmd文件,而不必更改到脚本所在的特定目录。它将更改为脚本目录,然后在完成后返回原始目录。
如果您希望脚本完成后命令窗口消失,也可以暂停一下。
如果我的.ps1脚本具有参数,我会使用.NET Forms进行GUI提示,以提示它们,但也可以使脚本足够灵活以接受参数(如果我想传递它们)。这样,我可以从资源管理器中双击它,而不必知道参数的详细信息,因为它将以列表框或其他形式询问我需要什么。
这就是我默认使用scrip以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中,或使用快捷方式进行欺骗),最终它所做的一切仅仅是为了防止您可以通过简单的方式来运行编写的脚本。
您可以使用Windows的“ SendTo”功能来简化PS1脚本的运行。使用这种方法,您可以右键单击PS1脚本并执行。这不能完全回答OP问题,但是很接近。希望这对其他人有用。顺便说一句..这对于其他各种任务很有帮助。
我用了这个(只需要运行一次)。还请确保您有权执行:
从具有提升权限的PowerShell中:
Set-ExecutionPolicy=RemoteSigned
然后从蝙蝠文件:
-----------------------------------------
ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit ^&'%%1'
assoc .ps1=Microsoft.PowerShellScript.1
-----------------------------------------
auto exit: remove -noexit
瞧!双击* .ps1将执行它。
The term '%1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
assoc
需要运行。
在Windows 10中,您可能还想删除Windows资源管理器的文件扩展名关联替代:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
除了HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
其他答案中提到的更改。
我尝试了此问题的最高答案,但遇到了错误消息。然后我在这里找到了答案:
对我来说行之有效的是使用以下解决方案:
powershell -ExecutionPolicy Bypass -File script.ps1
您可以将其粘贴到.bat文件中,然后双击它。
从http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily:
将的默认值设置HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell
为0