我正在向我的团队分发Powershell脚本。该脚本是从Vsphere客户端获取IP地址,进行mstsc连接并将其记录在共享文件中。
他们使用脚本的那一刻他们就知道了机器的IP地址。 之后,他们总是倾向于直接使用mstsc而不是运行powershell脚本。 (因为他们正在使用mstsc,我无法知道他们是否经常使用VM)
主要是他们告诉我运行PowerShell并不是直截了当的。
我因他们的懒惰而生病。
有没有办法通过双击.ps1文件来使PowerShell脚本工作?
答案 0 :(得分:100)
创建一个类似于“目标”的快捷方式:
powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
答案 1 :(得分:64)
或者,如果您希望所有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 De-castration Hack”。哈哈享受!
答案 2 :(得分:18)
请注意,PowerShell的一项安全功能是用户无法通过双击启动脚本。如果修改此设置,请务必小心。另一种方法是打包脚本。像PrimalScript这样的编辑可以做到这一点。用户仍然需要安装PowerShell,但他们可以双击exe。听起来你的团队需要一点教育。
答案 3 :(得分:15)
几年前我写了这篇文章(用管理员权限运行):
<#
.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 {}
}
答案 4 :(得分:13)
我同意设置系统设置可能有点多,但需要硬编码路径的快捷方式并不理想。 bat文件实际上很好地解决了这个问题
RunMyPowershellScript.bat
start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"
现在可以双击此批处理文件,可以轻松地为批处理文件创建快捷方式,并且可以将脚本部署到任何文件夹。
答案 5 :(得分:12)
您需要调整注册表。 首先,为HKEY_CLASSES_ROOT配置一个PSDrive,因为默认情况下没有设置它。对此的命令是:
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
现在,您可以在HKEY_CLASSES_ROOT中导航和编辑注册表项和值,就像在常规HKCU和HKLM PSDrives中一样。
配置双击以直接启动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'
答案 6 :(得分:9)
这适用于Windows 10和PowerShell 5.1:
答案 7 :(得分:8)
简单的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"'
答案 8 :(得分:3)
我尝试了此问题的最高答案,但遇到错误消息。然后我在这里找到答案:
PowerShell says "execution of scripts is disabled on this system."
最适合我的是使用此解决方案:
powershell -ExecutionPolicy Bypass -File script.ps1
您可以将其粘贴到.bat文件中,然后双击它。
答案 9 :(得分:3)
在我的子文件夹中放入一个简单的.cmd文件,其中包含同名的.ps1文件,例如,一个名为&#34; foobar&#34;的脚本。会有&#34; foobar.ps1&#34;和&#34; foobar.cmd&#34;。因此,要运行.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提示,但如果我想要传递它们,还要使脚本足够灵活,以接受参数。这样我就可以从资源管理器中双击它,而不必知道参数的细节,因为它会通过列表框或其他形式询问我需要什么。
答案 10 :(得分:2)
这是我默认使用scrips作为管理员运行的方法:
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"""''}"')
答案 11 :(得分:2)
您可以使用Windows&#39; SendTo&#39;使PS1脚本运行更容易的功能。使用此方法,您可以右键单击 一个PS1脚本并执行。这并没有完全回答OP问题,但它很接近。希望这对其他人有用。 BTW ..这对你很有帮助 各种其他任务。
答案 12 :(得分:2)
如果您熟悉高级Windows管理,则可以使用this ADM package(该页面上包含说明)并允许在通过此模板和本地GPO双击后运行PS脚本。在此之后,您只需将与.ps1文件类型相关联的默认程序更改为powershell.exe
(使用搜索,它已经完全隐藏),您就可以通过双击运行PS脚本了。
否则我建议坚持使用其他建议,因为您可以使用这些管理工具搞乱整个系统。
我认为默认设置太严格了。如果有人设法在您的计算机上放置一些恶意代码,那么他也可以绕过这个限制(将其包装到.cmd文件或.exe中,或者用快捷方式进行操作)并且它最终完成的所有操作只是为了防止您运行您编写的脚本的简便方法。
答案 13 :(得分:1)
这是基于KoZm0kNoT的答案。我将其修改为跨驱动器工作。
@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {.\%~n0.ps1 %*}"
popd
popd
如果用户的cwd位于不同的驱动器上,则需要两个pushd / popds。如果没有外部设置,带有脚本的驱动器上的cwd将会丢失。
答案 14 :(得分:1)
我用过这个(需要只运行一次);还要确保您有权执行:
来自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将执行它。
答案 15 :(得分:1)
在Windows 10中,您可能还想删除Windows资源管理器的文件扩展名关联替代项:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
除了其他答案中提到的HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
更改之外。
答案 16 :(得分:0)
一种与UNIX shar(shell存档)相同精神的解决方案。
您可以将Powershell脚本放入扩展名为.cmd
(而不是.ps1
)的文件中,并将其放在开头:
@echo off
Rem Make powershell read this file, skip a number of lines, and execute it.
Rem This works around .ps1 bad file association as non executables.
PowerShell -Command "Get-Content '%~dpnx0' | Select-Object -Skip 5 | Out-String | Invoke-Expression"
goto :eof
# Start of PowerShell script here
答案 17 :(得分:0)
您可能不想,但一个简单的方法就是创建一个 .BAT 文件并将您的命令放入:
powershell ./generate-strings-table-en.ps1
powershell ./generate-conjoined-tables-it.ps1
然后双击该 BAT 文件。
答案 18 :(得分:0)
您可以将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
设置为默认应用将其恢复为默认行为。
答案 19 :(得分:-1)
来自http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily:
将HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell
的默认值设置为0