有没有办法通过双击.ps1文件使PowerShell脚本工作?

Sam*_*abu 119 powershell powershell-2.0

我正在向我的团队分发Powershell脚本.该脚本是从Vsphere客户端获取IP地址,进行mstsc连接并将其记录在共享文件中.

他们使用脚本的那一刻他们就知道了机器的IP地址.之后,他们总是倾向于直接使用mstsc而不是运行powershell脚本.(因为他们正在使用mstsc,我无法知道他们是否经常使用VM)

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

我因他们的懒惰而生病.

有没有办法通过双击.ps1文件使PowerShell脚本工作?

Dav*_*ant 117

创建一个类似于"目标"的快捷方式:

powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
Run Code Online (Sandbox Code Playgroud)

  • 使用它:`-noLogo -ExecutionPolicy unrestricted -file <path>`作为回答:@ user3071883 (5认同)
  • 对于未来的读者:下面的答案中有一个注册表黑客可以完成OP的要求.接受的答案没有. (4认同)
  • 正如Jeffery Hicks(他是powershell的权威资源)建议不建议更改设置,我会投票给你的答案是最佳答案,JPBlanc答案是有用的答案. (3认同)
  • 有没有办法做到这一点,但使用相对/当前路径? (2认同)

小智 70

或者,如果您希望所有PS1文件都像VBS文件一样工作,您可以像这样编辑注册表:

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
Run Code Online (Sandbox Code Playgroud)

编辑默认值是这样的......

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"
Run Code Online (Sandbox Code Playgroud)

然后,您可以像您希望的那样双击所有.PS1文件.以我的拙见,能够开箱即用.

我打算称之为"Powershell De-castration Hack".大声笑享受!

  • 这是唯一一个在这个答案列表中为我工作的人.我不准备接受"不建议"作为答案 - 我告诉PC要做什么,PC没有告诉我. (18认同)
  • 这实际上是双绕道.删除双击运行的限制,*和*绕过PowerShell的ExecutionPolicy,这意味着即使从控制台也可以防止运行不受信任的脚本. (6认同)
  • 如果你确实想要使用这种方法,那么注册表项的正确默认值实际上是"C:\ Windows\System32\WindowsPowerShell\v1.0\powershell.exe"-NoLogo -File"%1"%*`其中您可以选择包含`-ExecutionPolicy unrestricted`.请注意命令末尾的更改,该更改允许将零个或多个参数传递给PowerShell脚本.百分号周围的引号和间距应完全如图所示. (4认同)
  • 这是错误的做法.您正在更改"打开"命令所执行的操作,而不是将"使用PowerShell运行"设置为默认值.请参阅下面的itgala.xyz答案. (2认同)
  • 对于命令行解决方案,而不是编辑注册表,可以键入`ftype Microsoft.PowerShellScript.1 = ^“ ^%SystemRoot ^%\ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe ^” -NoLogo -ExecutionPolicy Unrestricted-文件^“%1 ^”%*`将完成相同的操作。 (2认同)

Jef*_*cks 19

请注意,PowerShell的安全功能之一是用户无法通过双击启动脚本.如果修改此设置,请务必小心.另一种方法是打包脚本.像PrimalScript这样的编辑可以做到这一点.用户仍然需要安装PowerShell,但他们可以双击exe.听起来你的团队需要一点教育.

  • 这是一个愚蠢无用的安全功能.你可以通过双重运行批量运行吗?是的,一个exe?是.一个VBScript?是.我没有意识到为什么一个poweshell脚本会被认为比其他所有脚本更加笨拙 (12认同)
  • 我不知道你们是谁,但我确实在错误的电脑上运行了一个蝙蝠文件,然后意外双击.有了自动化管理的东西,限制它是完全合理的. (6认同)
  • 这是一个安全功能,因为它会将黑客延迟*至少*几分钟,直到找到替代方案! (3认同)
  • 您可以双击 EXE 文件,所以我不知道这有什么帮助。但 Powershell 团队肯定知道这个基本论点。一定还有更多的事情要做。 (3认同)
  • 如果你编写的脚本执行起来“危险”,并且你没有添加基本的确认过程......我认为你喜欢危险的生活。 (2认同)

JPB*_*anc 16

我几年前写过这个(用管理员权限运行):

<#
.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 {}
}
Run Code Online (Sandbox Code Playgroud)

  • 为了使其正常工作,我不得不对其进行更改:Computer \ HKEY_CLASSES_ROOT \ Applications \ powershell.exe \ Shell \ Open \ Command。我对注册表的理解不足以解释为什么会这样。也许是因为我正在运行Powershell 3.0?无论如何,感谢您的脚本。 (2认同)

Joh*_*ulé 16

与 UNIX shar(shell 存档)具有相同精神的解决方案。

.cmd您可以将 powershell 脚本放入扩展名为(而不是)的文件中.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
Run Code Online (Sandbox Code Playgroud)


小智 13

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

RunMyPowershellScript.bat

 start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"
Run Code Online (Sandbox Code Playgroud)

现在可以双击此批处理文件,可以轻松地为批处理文件创建快捷方式,并且可以将脚本部署到任何文件夹.


Fra*_*cis 13

我尝试了这个问题的最上面的答案,但遇到了错误消息。然后我在这里找到了答案:

PowerShell 表示“此系统上禁用了脚本执行”。

对我来说效果很好的是使用这个解决方案:

powershell -ExecutionPolicy Bypass -File script.ps1
Run Code Online (Sandbox Code Playgroud)

您可以将其粘贴到 .bat 文件中并双击它。

  • 这对我有用,我认为这比捷径方法更好。 (2认同)

Ale*_*ger 12

你需要调整注册表.首先,为HKEY_CLASSES_ROOT配置一个PSDrive,因为默认情况下没有设置它.对此的命令是:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
Run Code Online (Sandbox Code Playgroud)

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

要配置双击以直接启动PowerShell脚本:

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0
Run Code Online (Sandbox Code Playgroud)

要配置双击以在PowerShell ISE中打开PowerShell脚本,请执行以下操作:

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'
Run Code Online (Sandbox Code Playgroud)

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

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'
Run Code Online (Sandbox Code Playgroud)


viz*_*zmi 12

这适用于Windows 10和PowerShell 5.1:

  • 右键单击.ps1文件
  • 打开用...
  • 选择其他应用
  • 将powershell.exe的位置复制到地址栏(默认情况下不会显示Windows文件夹)即C:\ Windows\System32\WindowsPowerShell\v1.0
  • 选择powershell.exe
  • 选择"始终使用此应用程序打开.ps1文件"
  • 单击确定

  • 很好的答案。如果您需要设置执行策略 - 这对我有用 `Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned` (6认同)
  • 这怎么不是得票最高的答案呢?当您可以通过文件关联按照 Windows 预期的方式进行操作时,为什么我们要直接编辑注册表或使用批处理文件呢? (3认同)
  • 可能您需要将主机上的执行策略设置为合理的值,即 RemoteSigned (2认同)
  • 这已经有好几年了,直到半年前没有人想到过?-我也做了这一点,并且效果很好,尽管您必须做更多的配置,否则powershell根本不会运行任何.ps1脚本(请参阅`Set-ExecutionPolicy`)。 (2认同)
  • 如果您希望它起作用,脚本名称似乎不需要包含空格。除此之外,它似乎工作得很好。 (2认同)

The*_*nix 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"'
Run Code Online (Sandbox Code Playgroud)

  • 为了获得更高的安全性,我建议您使用`ExecutionPolicy RemoteSigned`,这样从网络/互联网下载的随机脚本(其元数据表示它不是在本地创建的)不会通过双击执行,但是您拥有的任何文件通过复制并将代码粘贴到.ps1文件中而创建的文件将执行,因为它没有与之关联的元数据。 (2认同)

elB*_*ord 8

你可以设置的默认文件关联ps1的文件是powershell.exe,这将允许您通过双击它执行PowerShell脚本。

在 Windows 10 中,

  1. 右键单击一个ps1文件
  2. 点击 Open with
  3. 点击 Choose another app
  4. 在弹出的窗口中,选择 More apps
  5. 滚动到底部并选择Look for another app on this PC
  6. 浏览并选择C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  7. 项目清单

这将更改文件关联,ps1文件将通过双击它们来执行。您可以通过设置notepad.exe为默认应用程序将其更改回其默认行为。

来源

  • 这工作正常,但几乎重复了 vizmi 的答案。 (3认同)

小智 6

  1. 将REGEDIT导航到HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
  2. 在右侧窗格中,双击"(默认)"
  3. 删除"Open"(启动记事本)的现有值并键入"0"(为零,直接启动Powershell).

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


KoZ*_*NoT 5

将一个简单的 .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
Run Code Online (Sandbox Code Playgroud)

pushd/popd 允许您从命令提示符启动 .cmd 文件,而无需更改到脚本所在的特定目录。它将更改为脚本目录,然后完成后返回原始目录。

如果您希望在脚本完成时命令窗口消失,您也可以取消暂停。

如果我的 .ps1 脚本有参数,我会使用 .NET Forms 使用 GUI 提示来提示它们,但如果我想传递参数,也会使脚本足够灵活以接受参数。这样我就可以从资源管理器中双击它而不必知道参数的详细信息,因为它会询问我需要什么,包括列表框或其他形式。

  • 感谢您的批处理文件。如您所知,您可以将“for”语句替换为:“set SCRIPT_PATH=%~p0”(不带引号)。事实上,我会使用 ~dp0 而不是 ~p0 以便它可以跨驱动器工作。我自己会用这个。 (3认同)

DIM*_*_V2 5

  • 这是我的解决方案 2022

  • 安装“PowerShell-7.2.2-win-x64.msi”

  • 右键单击 file.ps1 并更改为使用“pwsh”执行

Powershell 注册表黑客和策略绕过对我来说从来不起作用。 在此输入图像描述