2012-04-13 99 views
77

我将Powershell脚本分发给我的团队。该脚本将从Vsphere客户端获取IP地址,进行mstsc连接并将其记录在共享文件中。有没有什么办法让双击.ps1文件的PowerShell脚本工作?

当他们使用脚本的时候,他们知道了机器的IP地址。 之后,他们总是倾向于直接使用mstsc而不是运行powershell脚本。 (因为他们使用mstsc我无法知道他们是否频繁使用虚拟机)

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

我因懒惰而生病。

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

+3

如何使用服务器上的日志? “不信任用户”可能意味着你不能相信他的数据,但更多的时候意味着不相信他不会懒惰。 – bdares 2012-04-13 07:56:48

+0

另请参阅http://www.howtogeek.com/204166/how-to-configure-windows-to-work-with-powershell-scripts-more-easily/ – 2016-02-19 03:05:06

回答

77

创建像这样的“目标”的快捷方式:

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

作为Jeffery Hicks(他是powershell中的权威资源)建议不建议改变设置,我会投你的答案是最好的答案和JPBlanc答案作为有用的答案。 – Samselvaprabu 2012-04-16 05:41:36

+4

使用这种搭配:'-nologo -ExecutionPolicy无限制-file '作为回答:@ user3071883 – 2016-01-03 14:30:25

+1

@UjjwalSingh:'-NoProfile'也是有帮助的,因为轮廓可以做各种事情,该脚本并不期望。 – Joey 2017-04-03 06:28:03

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 - [email protected] 
    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 {} 
} 
+0

请翻译!这是我def可以使用的东西:) – Sune 2012-04-13 09:07:10

+0

@JPBlanc:是的。如果可能,请将法语翻译成英语。这将有所帮助 – Samselvaprabu 2012-04-13 09:27:58

+0

所以我把英语句子,我希望它有帮助。 – JPBlanc 2012-04-13 09:56:18

14

要知道,一个PowerShell的安全功能是用户不能通过双击启动脚本。如果您修改此设置,请务必小心。另一种可能是打包你的脚本。像PrimalScript这样的编辑可以做到这一点。用户仍然需要安装PowerShell,但他们可以双击该exe文件。听起来你的团队需要一点教育。

+17

如何防止双击安全功能? – Nils 2015-10-07 07:28:51

+2

这是一项安全功能,因为它至少延迟了*几分钟的黑客时间,直到他们找到替代方案! – MarcH 2016-01-24 06:19:22

+4

这是一个愚蠢和无用的安全功能。你可以通过双击运行一批吗?是的,一个exe文件?是。一个VBScript?是。我没有意识到为什么poweshell脚本会比其他所有脚本都更加荒谬 – 2017-08-27 05:53:22

2

如果您熟悉高级Windows管理,那么您可以使用this ADM package(说明包含在该页面中),并允许在通过此模板和本地GPO双击后运行PS脚本。在此之后,您可以简单地将与.ps1文件类型关联的默认程序更改为powershell.exe(使用搜索,它非常隐蔽),然后您可以通过双击运行PS脚本。

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

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

+0

安装后,您可以在本地计算机策略 - >计算机配置 - >管理模板 - > Windows组件下的“本地组策略编辑器”中找到该设置。在那里,您可以启用它,并确保在随后启用的下拉列表中选择一个策略。 – Wouter 2012-12-12 11:06:22

45

或者,如果你希望所有的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”。大声笑享受!

+9

这是唯一一个在这个答案列表中为我工作的人。我不准备接受“不建议”作为答案 - 我告诉PC该做什么,个人电脑没有告诉我。 – Matt 2014-11-13 01:19:45

+4

这实际上是一个双旁路。消除双击运行的限制,*和*绕过PowerShell的ExecutionPolicy,这意味着即使从控制台也不会运行不受信任的脚本。 – Iszi 2014-11-26 13:20:34

+2

这是错误的做法。您正在更改“Open”命令的作用,而不是将“Run with PowerShell”设置为默认值。请参阅下面的itgala.xyz答案。 – Indy411 2016-10-10 04:52:13

5

简单的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"' 
+0

这会提示我“为以下参数提供值:值” - 我应该回复哪些内容? – Matt 2014-11-13 01:17:33

+0

@Matt固定的。 – usr 2017-05-29 11:16:03

9

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

RunMyPowershellScript.bat

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

此批处理文件,现在可以双点击,快捷方式可以很容易地创建批处理文件的问题,该脚本可以被部署到任何夹。

+0

请注意,您需要与bat文件位于同一文件夹中的ps1脚本。您以维护2个文件为代价获得复制粘贴功能。 – jiggunjer 2016-08-16 06:59:08

3

将一个简单的.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 

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

如果您希望命令窗口在脚本结束时消失,您也可以关闭暂停。

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

+1

感谢您的批处理文件。只是你知道,你可以用“set SCRIPT_PATH =%〜p0”(不带引号)替换“for”语句。实际上,我会使用〜dp0而不是〜p0,因此它可以在多个驱动器上工作。我会自己使用这个。 – zumalifeguard 2015-06-12 18:49:57

+0

这工作就像一个魅力。它确实帮助了我需要发送到现场的一些部署脚本。谢谢。 – usonianhorizon 2016-01-09 21:34:40

+0

没有理由在这里downvotes。 – 2016-06-06 14:10:00

1

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

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

从蝙蝠

然后文件


FTYPE Microsoft.PowerShellScript.1 = “C:\窗口\ system32 \ windowspowershell \ V1.0 \ powershell.exe” -noexit^& '%% 1'

assoc命令的.ps1 = Microsoft.PowerShellScript.1


自动退出:删除-noexit

瞧。双击a * .ps1将执行。

+0

'术语'%1'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后再试一次。“ – ajeh 2017-07-05 15:18:06

+0

只有接受的答案与此答案的组合对我有用,一旦我使用了接受的答案中的命令注册表项。显然需要运行'assoc'。 – ajeh 2017-07-05 15:25:24

1

这是基于KoZm0kNoT的回答。我修改了它以跨驱动器工作。

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

两个PUSHD/popds是在必要的情况下用户的CWD是一个不同的驱动器上。如果没有外部设置,驱动器上脚本中的cwd将会丢失。

5
  1. 导航REGEDIT到 HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\ Microsoft.PowerShellScript.1 \壳牌
  2. 在右窗格中,双击 “(默认)”
  3. 删除 “开放” 的现有值(其中启动记事本)并键入“0”(为零,直接启动Powershell)。

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

1

这是我用来在默认情况下以管理员身份运行scrips默认值:

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

你需要粘贴到默认值为:

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"""''}"') 
6

你需要调整注册表。 首先,为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' 
2

您可以使用Windows的“SendTo”功能使运行PS1脚本变得更容易。使用此方法,您可以右键单击 PS1脚本并执行。这并不完全回答OP的问题,但它很接近。希望这对其他人有用。顺便说一下..这对 有很多其他的任务是有帮助的。

  • 查找/搜索Powershell.exe
  • 右击Powershell.exe并选择打开文件位置
  • 上Powershell.exe右击并选择创建快捷方式。暂时保存一些类似于桌面的地方
  • 您可能希望以管理员身份打开默认设置。选择快捷方式>属性>高级>以管理员身份打开
  • 打开Sendto文件夹。开始>运行> Shell:Sendto
  • 将Powershell.exe快捷方式移动到Sendto文件夹
  • 您现在应该可以右键单击PS1脚本。
  • 右键单击PS1文件,选择SendTo上下文选项>选择Powershell快捷方式
  • 您的PS1脚本应该执行。
4

这为我工作在Windows 10和PowerShell 5.1:

  • 右击名为.ps1文件
  • 打开方式...
  • 选择另一个应用程序
  • 复制位置PowerShell.exe到地址栏(默认情况下,它不会显示Windows文件夹)即C:\ Windows \ System32 \ WindowsPowerShell \ v1.0
  • select powershell.exe
  • 选择“始终使用该程序打开的.ps1文件”
  • 单击确定
+0

可能你需要在主机上设置执行策略,使之合理,即RemoteSigned – vizmi 2017-08-23 05:09:45

+0

这已经有几年了,而且直到半年前才有人想到这一点? - 我也这么做了,它的工作原理很完美,但是你必须做更多的配置,否则PowerShell会拒绝运行任何.ps1脚本(参见'Set-ExecutionPolicy')。 – DarkWiiPlayer 2018-02-02 08:25:13

相关问题