web-dev-qa-db-fra.com

Existe-t-il un moyen de faire fonctionner un script PowerShell en double-cliquant sur un fichier .ps1?

Je distribue un script PowerShell à mon équipe. Le script consiste à extraire une adresse IP du client Vsphere, à établir une connexion mstsc et à la consigner dans un fichier partagé.

Au moment où ils ont utilisé le script, ils ont appris à connaître l'adresse IP de la machine. Après cela, ils ont toujours tendance à utiliser directement mstsc au lieu d'exécuter le script PowerShell. (Comme ils utilisent mstsc, je ne suis pas en mesure de savoir s'ils utilisent le VM fréquemment ou non.)

Ils me disent principalement que l’utilisation de PowerShell n’est pas simple.

Je suis malade par leur paresse.

Existe-t-il un moyen de faire fonctionner un script PowerShell en double-cliquant sur un fichier .ps1?

108
Samselvaprabu

Créez un raccourci avec quelque chose comme ceci comme "cible":

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

Ou si vous voulez que tous les fichiers PS1 fonctionnent comme les fichiers VBS, vous pouvez éditer le registre de la manière suivante:

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command

Modifiez la valeur par défaut pour qu'elle ressemble à quelque chose comme ça ...

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"

Ensuite, vous pouvez simplement double-cliquer sur tous vos fichiers .PS1 comme vous le souhaitez. à mon humble avis, être capable de sortir de la boîte.

Je vais appeler cela "Le piratage de la castration Powershell". LOL amusez-vous!

67
user3071883

Sachez que l'une des fonctionnalités de sécurité de PowerShell est que les utilisateurs ne peuvent PAS lancer de script avec un double clic. Faites très attention si vous modifiez ce paramètre. Une alternative pourrait être de conditionner votre script. Certains éditeurs comme PrimalScript peuvent le faire. Les utilisateurs ont toujours besoin de PowerShell mais ils peuvent ensuite double-cliquer sur le fichier .exe. Et il semble que votre équipe a besoin d'un peu d'éducation.

17
Jeffery Hicks

Je l'ai écrit il y a quelques années (utilisez-le avec les droits d'administrateur):

<#
.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 {}
}
15
JPBlanc

Je conviens que définir un paramètre système peut être un peu difficile, mais le raccourci nécessitant un chemin codé en dur n'est pas idéal. Un fichier chauve-souris résout bien le problème

RunMyPowershellScript.bat

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

Vous pouvez maintenant double-cliquer sur ce fichier de commandes, créer facilement des raccourcis vers le fichier de commandes et déployer le script dans n’importe quel dossier.

13
Rick

Vous aurez besoin de Tweak registre. Commencez par configurer un lecteur PSDrive pour HKEY_CLASSES_ROOT, car celui-ci n’est pas configuré par défaut. La commande pour ceci est:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

Vous pouvez maintenant naviguer et éditer les clés et les valeurs de registre dans HKEY_CLASSES_ROOT, comme vous le feriez avec les lecteurs classiques HKCU et HKLM.

Pour configurer un double-clic afin de lancer les scripts PowerShell directement:

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

Pour configurer un double-clic afin d'ouvrir des scripts PowerShell dans PowerShell ISE:

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

Pour restaurer la valeur par défaut (double-cliquez pour ouvrir les scripts PowerShell dans le bloc-notes):

Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'
12
Alex Langer

Cela a fonctionné pour moi sur Windows 10 et PowerShell 5.1:

  • clic droit sur le fichier .ps1
  • Ouvrir avec...
  • Choisissez une autre application
  • Copiez l'emplacement de powershell.exe dans la barre d'adresse (par défaut, le dossier Windows ne sera pas affiché), c'est-à-dire C:\Windows\System32\WindowsPowerShell\v1.0
  • sélectionnez Powershell.exe
  • sélectionnez "Toujours utiliser cette application pour ouvrir les fichiers .ps1"
  • cliquez sur OK
10
vizmi

De simples commandes PowerShell pour définir cela dans le registre;

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
Thermionix
  1. Accédez à REGEDIT vers HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell.
  2. Dans le volet de droite, double-cliquez sur "(valeur par défaut)".
  3. Supprimez la valeur existante de "Ouvrir" (qui lance le Bloc-notes) et tapez "0" (étant zéro, ce qui lance directement Powershell).

Annulez la valeur si vous souhaitez utiliser à nouveau le Bloc-notes par défaut.

6
gth

mettre un simple fichier .cmd dans mon sous-dossier avec mon fichier .ps1 portant le même nom, ainsi, par exemple, un script nommé "foobar" aurait "foobar.ps1" et "foobar.cmd". Donc, pour exécuter le fichier .ps1, il suffit de cliquer sur le fichier .cmd à partir de l’explorateur ou d’exécuter le fichier .cmd à partir d’une invite de commande. J'utilise le même nom de base car le fichier .cmd recherchera automatiquement le fichier .ps1 en utilisant son propre nom.

::====================================================================
:: 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

Le pushd/popd vous permet de lancer le fichier .cmd à partir d'une invite de commande sans avoir à passer au répertoire spécifique dans lequel se trouvent les scripts. Il passera au répertoire de script puis, une fois terminé, revenez au répertoire d'origine.

Vous pouvez également désactiver la pause si vous souhaitez que la fenêtre de commande disparaisse à la fin du script.

Si mon script .ps1 a des paramètres, je les invite à l'aide d'interfaces graphiques à l'aide de .NET Forms, mais rend également les scripts suffisamment souples pour accepter les paramètres si je souhaite les transmettre à la place. De cette façon, je peux simplement double-cliquer dessus dans Explorer et ne pas avoir à connaître les détails des paramètres car il me demandera ce dont j'ai besoin, avec des zones de liste ou d'autres formulaires.

3
KoZm0kNoT

Si vous connaissez bien l'administration Windows avancée, vous pouvez utiliser ce package ADM (des instructions sont fournies sur cette page) et autoriser l'exécution de scripts PowerShell après un double-clic via ce modèle et l'objet de stratégie de groupe local. Après cela, vous pouvez simplement changer le programme par défaut associé à .ps1 filetype en powershell.exe (utilisez search, il est assez caché) et vous êtes prêt à exécuter les scripts PowerShell en double-clic.

Autrement, je vous recommande de vous en tenir à d’autres suggestions, car vous pouvez gâcher tout le système avec les outils de cette administration.

Je pense que les paramètres par défaut sont trop strictes. Si quelqu'un parvient à mettre un code malveillant sur votre ordinateur, il/elle est également capable de contourner cette restriction (en l'enveloppant dans un fichier .cmd ou .exe, ou un truc avec raccourci) et tout ce que cela accomplit à la fin est juste d'empêcher de manière simple d’exécuter le script que vous avez écrit.

2
Jirrick

Vous pouvez utiliser la fonctionnalité "Envoyer à" de Windows pour faciliter l'exécution de scripts PS1. En utilisant cette méthode, vous pouvez cliquer avec le bouton droit sur un script PS1 et l'exécuter. Ceci ne répond pas exactement à la question du PO mais est proche. Espérons que cela soit utile aux autres. BTW .. cela est utile pour une variété d'autres tâches.

  • Localiser/Rechercher Powershell.exe
  • Faites un clic droit sur Powershell.exe et choisissez Ouvrir l'emplacement du fichier.
  • Faites un clic droit sur Powershell.exe et choisissez Créer un raccourci. Enregistrez temporairement un endroit comme votre bureau
  • Vous voudrez peut-être ouvrir en tant qu'administrateur par défaut. Sélectionnez Raccourci> Propriétés> Avancé> Ouvrir en tant qu'administrateur.
  • Ouvrez le dossier Sendto. Démarrer> Exécuter> Shell: Sendto
  • Déplacez le raccourci Powershell.exe dans le dossier Sendto
  • Vous devriez maintenant pouvoir faire un clic droit sur un script PS1.
  • Clic droit sur un fichier PS1, sélectionnez l'option contextuelle SendTo> Sélectionnez le raccourci Powershell
  • Votre script PS1 devrait s'exécuter.
2
MrRobot

C'est ce que j'utilise pour que les scripts s'exécutent en tant qu'administrateur par défaut:

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

Vous devrez coller cela dans regedit comme valeur par défaut pour:

HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command

Ou voici un script qui le fera pour vous:

$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"""''}"')
2
Mica

Ceci est basé sur la réponse de KoZm0kNoT. Je l'ai modifié pour fonctionner sur plusieurs lecteurs.

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

Les deux pushd/popds sont nécessaires si le lecteur de l’utilisateur est sur un lecteur différent. Sans l'ensemble externe, le cwd sur le lecteur avec le script sera perdu.

2
zumalifeguard

Vous pouvez définir l'association de fichier par défaut de ps1 fichiers à être powershell.exe _ qui vous permettra d’exécuter un script PowerShell en double-cliquant dessus.

Sous Windows 10,

  1. Faites un clic droit sur un ps1 fichier
  2. Cliquez sur Open with
  3. Cliquez sur Choose another app
  4. Dans la fenêtre contextuelle, sélectionnez More apps
  5. Faites défiler vers le bas et sélectionnez Look for another app on this PC.
  6. Recherchez et sélectionnez C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe.
  7. Élément de liste

Cela changera l'association de fichier et ps1 Les fichiers s’exécuteront en double-cliquant dessus. Vous pouvez rétablir son comportement par défaut en définissant notepad.exe à l'application par défaut.

Source

1
elBradford

Je l'ai utilisé (besoin de l'exécuter une seule fois); Assurez-vous également que vous avez le droit d'exécuter:

depuis PowerShell avec des droits élevés:

Set-ExecutionPolicy=RemoteSigned

puis à partir d'un fichier chauve-souris:

-----------------------------------------

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

 assoc .ps1=Microsoft.PowerShellScript.1

-----------------------------------------
auto exit: remove -noexit 

et le tour est joué; Un double-clic sur un fichier * .ps1 l'exécutera.

1
Paul Fijma

Dans Windows 10, vous pouvez également vouloir supprimer le remplacement de l'explorateur Windows pour l'association d'extension de fichier:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice

en plus de HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command changement mentionné dans d'autres réponses.

Voir https://stackoverflow.com/a/2697804/1360907

1
Chris Xue