有没有什么办法让双击.ps1文件的PowerShell脚本工作?

我将Powershell脚本分发给我的团队。 该脚本将从Vsphere客户端获取IP地址,进行mstsc连接并将其logging在共享文件中。

他们使用脚本的那一刻才知道机器的IP地址。 之后,他们总是倾向于直接使用mstsc而不是运行powershell脚本。 (因为他们正在使用mstsc我不知道他们是否频繁使用VM)

主要是他们告诉我,运行PowerShell并不是直截了当的。

我因懒惰而生病。

有没有什么办法让双击.ps1文件的PowerShell脚本工作?

创build一个类似“Target”的快捷方式:

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah" 

或者,如果您希望所有PS1文件以VBS文件的方式工作,您可以像这样编辑registry:

 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”。 大声笑享受!

几年前我写了这个(使用pipe理员权限运行):

 <# .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 : JP 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 {} } 

请注意,PowerShell的安全function之一是用户无法双击启动脚本。 如果您修改此设置,请小心使用。 另一种方法是打包脚本。 像PrimalScript一些编辑可以做到这一点。 用户仍然需要安装PowerShell,但他们可以双击该exe文件。 听起来你的团队需要一点教育。

我同意设置系统设置可能有点多,但是需要硬编码path的快捷方式并不理想。 bat文件很好地解决了这个问题

RunMyPowershellScript.bat

  start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah" 

这个batch file现在可以被双击,快捷方式可以很容易地创build到batch file,脚本可以部署到任何文件夹。

你需要调整registry。 首先,为HKEY_CLASSES_ROOTconfiguration一个PSDrive,因为这个默认没有设置。 这个命令是:

 New-PSDrive HKCR Registry HKEY_CLASSES_ROOT 

现在您可以在HKEY_CLASSES_ROOT中导航和编辑registry项和值,就像您在常规HKCU和HKLM PSDrives中一样。

要configuration双击直接启动PowerShell脚本:

 Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0 

configuration双击打开PowerShell ISE中的PowerShell脚本:

 Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit' 

要恢复默认值(设置双击以在记事本中打开PowerShell脚本):

 Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open' 
  1. 导航REGEDIT到HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Microsoft.PowerShellScript.1 \ Shell
  2. 在右侧窗格中,双击“(默认)”
  3. 删除“打开”(启动记事本)的现有值,并键入“0”(零,直接启动Powershell)。

如果您希望再次使用记事本作为默认值,则还原该值。

简单的powershell命令在registry中设置这个;

 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.cmd”。 所以要运行.ps1,我所要做的就是从资源pipe理器中单击.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提示符,但是如果我想传递参数,也可以使脚本足够灵活以接受参数。 这样,我可以从资源pipe理器中双击它,而不必知道参数的细节,因为它会问我需要什么,列表框或其他forms。

如果您熟悉高级Windowspipe理,则可以使用此ADM包 (说明包含在该页面中),并在通过此模板和本地GPO双击后允许运行PS脚本。 在此之后,您可以简单地将与.ps1文件types关联的默认程序更改为powershell.exe (使用search,这是相当隐藏的),您可以通过双击运行PS脚本。

否则,我会build议坚持其他build议,因为你可以用这些pipe理工具搞砸整个系统。

我认为默认设置太严格了。 如果有人设法在您的计算机上放置一些恶意代码,那么他也可以绕过这个限制(将其封装到.cmd文件或.exe中,或者用快捷方式进行欺骗),最终所做的只是防止您简单的方法来运行你写的脚本。

这在Windows 10和PowerShell 5.1中适用于我:

  • 右键单击.ps1文件
  • 打开用…
  • select其他应用程序
  • 复制PowerShell.exe的位置到地址栏(默认情况下,它不会显示Windows文件夹)即C:\ Windows \ System32 \ WindowsPowerShell \ v1.0
  • selectpowershell.exe
  • select“总是使用这个应用程序打开.ps1文件”
  • 单击确定

我用这个:(只需要运行一次)还要确保你有权执行:

从提升权限的PowerShell:Set-ExecutionPolicy = RemoteSigned

然后从一个bat文件


ftype Microsoft.PowerShellScript.1 =“C:\ WINDOWS \ system32 \ windowspowershell \ v1.0 \ powershell.exe”-noexit ^&'%% 1'

assoc .ps1 = Microsoft.PowerShellScript.1


自动退出:删除-noexit

和瞧。 双击一个* .ps1将执行。

这是基于KoZm0kNoT的回答。 我修改它在驱动器上工作。

 @echo off pushd "%~d0" pushd "%~dp0" powershell.exe -sta -c "& {.\%~n0.ps1 %*}" popd popd 

如果用户的cwd位于不同的驱动器上,则需要两个push / popd。 没有外部设置,驱动器上的脚本将会丢失。

这是我用来作为pipe理员默认运行的脚本:

 Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList '-File """%1"""'}" 

您需要将其粘贴到registry中作为默认值:

 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”function使运行PS1脚本更容易。 使用这种方法,你可以右键点击一个PS1脚本并执行。 这是不完全回答OP的问题,但它是接近的。 希望这对其他人有用。 顺便说一下..这是有助于各种其他任务。

  • find/searchPowershell.exe
  • 右键单击Powershell.exe并select打开文件位置
  • 右键单击Powershell.exe并select创build快捷方式。 暂时保存一些像你的桌面的地方
  • 您可能希望以pipe理员身份打开。 select快捷方式>属性>高级>以pipe理员身份打开
  • 打开Sendto文件夹。 开始>运行> Shell:Sendto
  • 将Powershell.exe快捷方式移动到Sendto文件夹
  • 你现在应该可以右键点击一个PS1脚本。
  • 右键单击一个PS1文件,selectSendTo上下文选项>selectPowershell快捷方式
  • 你的PS1脚本应该执行。

http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell的默认值设置为0