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


139

Je distribue un script PowerShell à mon équipe. Le script consiste à récupérer 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 mstsc directement au lieu d'exécuter le script PowerShell. (Comme ils utilisent mstsc, je ne suis pas en mesure de savoir s'ils utilisent fréquemment la machine virtuelle ou non.)

Ils me disent principalement que l'exécution de PowerShell n'est pas simple.

Je suis malade de leur paresse.

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


3
Que diriez-vous d'utiliser les journaux sur le serveur? «Ne faites pas confiance à l'utilisateur» peut signifier que vous ne pouvez pas lui faire confiance avec vos données, mais le plus souvent cela signifie ne pas lui faire confiance pour ne pas être paresseux.


Compilation d'un script PS à l'aide de Powershell studio sapien.com/software/powershell_studio
Boucle racine

Je préfère l'exécuter via vscode (pour que je puisse voir la console et la déboguer)
JinSnow

Réponses:


132

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

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

3
Comme Jeffery Hicks (il est une ressource faisant autorité dans PowerShell) a indiqué qu'il n'est pas recommandé de modifier les paramètres, je voterais pour que votre réponse soit la meilleure réponse et que la réponse de JPBlanc soit utile.
Samselvaprabu

6
utilisez ceci avec: `-noLogo -ExecutionPolicy unrestricted -file <chemin>` comme répondu par: @ user3071883
Ujjwal Singh

1
@UjjwalSingh: -NoProfileest également utile, car le profil peut faire toutes sortes de choses auxquelles le script ne s'attend pas.
Joey

5
Pour les futurs lecteurs: Il y a un hack de registre dans les réponses ci-dessous qui accomplit ce que OP a demandé. La réponse acceptée ne le fait pas.
Wouter

2
Existe-t-il un moyen de le faire mais en utilisant un relatif / le chemin actuel?
mythofechelon

79

Ou si vous voulez que tous les fichiers PS1 fonctionnent comme les fichiers VBS, vous pouvez modifier le registre comme ceci:

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

Modifiez la valeur par défaut pour qu'elle soit 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 en mesure de sortir de la boîte.

Je vais appeler cela "le piratage de la décastration de Powershell". LOL profiter!


27
C'est le seul qui a fonctionné pour moi dans cette liste de réponses. Je ne suis pas prêt à accepter «Ce n'est pas conseillé» comme réponse - je dis au PC quoi faire, le PC ne me le dit pas.
Matt

7
Il s'agit en fait d'un double contournement. Supprime la restriction contre le double-clic pour exécuter et contourne ExecutionPolicy de PowerShell, qui vise à empêcher l'exécution de scripts non approuvés, même à partir de la console.
Iszi

4
Ce n'est pas la bonne façon de procéder. Vous modifiez ce que fait la commande «Ouvrir» au lieu de définir «Exécuter avec PowerShell» par défaut. Voir la réponse itgala.xyz ci-dessous.
Indy411

4
Si vous souhaitez utiliser cette méthode, la valeur par défaut correcte pour la clé de Registre est en fait l' "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -File "%1"%*endroit où vous pouvez éventuellement inclure le fichier -ExecutionPolicy unrestricted. Notez le changement à la fin de la commande qui permet de transmettre zéro ou plusieurs paramètres au script PowerShell. Les guillemets et l'espacement autour des signes de pourcentage doivent être exactement comme indiqué.
Glenn Slayden

2
Pour une solution de ligne de commande plutôt que de modifier le registre, vous pouvez taper ftype Microsoft.PowerShellScript.1=^"^%SystemRoot^%\System32\WindowsPowerShell\v1.0\powershell.exe^" -NoLogo -ExecutionPolicy Unrestricted -File ^"%1^" %*ce qui fera la même chose.
Damian T.

21

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 l'exe. Et il semble que votre équipe ait besoin d'un peu d'éducation.


3
C'est une fonction de sécurité car elle retarde les pirates d' au moins quelques minutes jusqu'à ce qu'ils trouvent une alternative!
MarcH

23
C'est une fonction de sécurité stupide et inutile. Pouvez-vous exécuter un lot en effectuant un double clic dessus? Oui, un exe? Oui. Un VBScript? Oui. Je n'arrive pas à réaliser pourquoi un script poweshell serait considéré comme plus dangereux que tous les autres
Mauro F.

12
Je ne sais pas pour vous les gars, mais j'ai définitivement exécuté un fichier chauve-souris sur le mauvais ordinateur avant avec un double-clic accidentel. Avec quelque chose destiné à automatiser l'administration, il est parfaitement logique de restreindre cela.
lordcheeto

1
Vous pouvez double-cliquer sur un fichier EXE pour que je ne vois pas comment cela aide. Mais l'équipe Powershell est sûrement consciente de cet argument de base. Il doit y avoir plus.
usr

1
Si vous écrivez des scripts qui sont "dangereux" à exécuter et que vous n'ajoutez pas de processus de confirmation de base ... Je pense que vous aimez vivre dangereusement.
Romain Vincent

18

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, il n'affichera pas le dossier Windows), 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

2
Vous devez probablement définir la politique d'exécution sur la machine hôte sur quelque chose de raisonnable, c'est-à-dire RemoteSigned
vizmi

4
Cela date de plusieurs années et personne n'y a pensé jusqu'à il y a six mois? - J'ai fait cela aussi et cela fonctionne parfaitement, bien que vous deviez faire plus de configuration ou PowerShell refusera d'exécuter des scripts .ps1 du tout (voir Set-ExecutionPolicy).
DarkWiiPlayer

On dirait que le nom du script ne doit contenir aucun espace si vous voulez que cela fonctionne. À part cela, il semble fonctionner parfaitement.
Luke

2
En quoi n'est-ce pas la réponse la plus votée? Pourquoi éditerions-nous le registre directement ou utiliserions-nous des fichiers batch alors que vous pouvez simplement le faire comme Windows l'a prévu, via des associations de fichiers?
Dr Kickass le

@ Dr.Kickass C'est probablement l'une des réponses les plus récentes, je suppose
vizmi

17

J'ai écrit ceci il y a quelques années (exécutez-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 - 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 {}
}

2
J'ai dû le changer à cet emplacement pour qu'il fonctionne: Computer \ HKEY_CLASSES_ROOT \ Applications \ powershell.exe \ Shell \ Open \ Command. Je ne comprends pas suffisamment le registre pour expliquer pourquoi. Peut-être parce que j'utilise Powershell 3.0? Quoi qu'il en soit, merci pour le script.
Wouter

15

Vous devrez modifier le registre. Tout d'abord, configurez un PSDrive pour HKEY_CLASSES_ROOT car il n'est pas configuré par défaut. La commande pour cela est:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

Vous pouvez désormais parcourir et modifier les clés de registre et les valeurs dans HKEY_CLASSES_ROOT comme vous le feriez dans les lecteurs PSDrives HKCU et HKLM normaux.

Pour configurer le double-clic pour lancer directement les scripts PowerShell:

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

Pour configurer le double-clic pour ouvrir les scripts PowerShell dans PowerShell ISE:

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

Pour restaurer la valeur par défaut (définit un double-clic pour ouvrir les scripts PowerShell dans le Bloc-notes):

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

J'ai essayé de restaurer la valeur par défaut en utilisant la dernière ligne d'un ISE PowerShell élevé, mais apparemment, si vous avez utilisé une commande comme Thermionix l'a décrite, elle remplace la valeur par défaut, vous devez donc réinitialiser la commande Shell.command explicitement (mais je n'ai pas trouvé le syntaxe correcte pour cela, j'ai donc dû passer par le Panneau de configuration> Programmes> Associations de fichiers).
dragon788

13

Je conviens que la définition d'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"

Ce fichier de commandes peut maintenant être double-cliqué sur, des raccourcis peuvent être facilement créés vers le fichier de commandes et le script peut être déployé dans n'importe quel dossier.


Notez que vous avez besoin du script ps1 dans le même dossier que le fichier bat. Vous gagnez en capacité de copier-coller au prix de la maintenance de 2 fichiers.
jiggunjer

11

Commandes PowerShell simples 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"'

5
Pour un peu plus de sécurité, je suggérerais d'utiliser de ExecutionPolicy RemoteSignedsorte qu'un script aléatoire téléchargé à partir du réseau / Internet (avec les métadonnées indiquant qu'il n'a pas été créé localement) ne s'exécutera pas à partir d'un double clic, mais tout fichier que vous avez créé par copie et coller du code dans un fichier .ps1 s'exécutera car ces métadonnées ne lui sont pas associées.
dragon788

6
  1. Naviguez REGEDIT vers HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Microsoft.PowerShellScript.1 \ Shell
  2. Dans le volet droit, double-cliquez sur «(par défaut)»
  3. Supprimez la valeur existante de "Open" (qui lance le Bloc-notes) et tapez "0" (étant zéro, ce qui lance Powershell directement).

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


5

Vous pouvez définir l'association de ps1fichiers par défaut des fichiers surpowershell.exe ce 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 des ps1fichiers et les fichiers s'exécuteront en double-cliquant dessus. Vous pouvez le modifier à son comportement par défaut en définissant notepad.exel'application par défaut.

La source


1
Cela fonctionne bien mais reproduit à peu près la réponse de vizmi.
Marteng le

4

mettre un simple fichier .cmd dans mon sous-dossier avec mon fichier .ps1 avec le même nom, ainsi, par exemple, un script nommé "foobar" aurait "foobar.ps1" et "foobar.cmd". Donc, pour exécuter le .ps1, tout ce que j'ai à faire est de cliquer sur le fichier .cmd de l'explorateur ou d'exécuter le .cmd à partir d'une invite de commande. J'utilise le même nom de base car le fichier .cmd recherchera automatiquement le .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 dans le répertoire spécifique où se trouvent les scripts. Il passera au répertoire du script puis, une fois terminé, reviendra 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 avec des invites d'interface graphique à l'aide de formulaires .NET, mais je rends également les scripts suffisamment flexibles pour accepter des paramètres si je veux les transmettre à la place. De cette façon, je peux simplement double-cliquer dessus à partir de l'Explorateur 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.


2
Merci pour le fichier batch. Juste pour que vous le sachiez, vous pouvez remplacer l'instruction "for" par simplement: "set SCRIPT_PATH =% ~ p0" (sans guillemets). En fait, j'utiliserais ~ dp0 au lieu de ~ p0 pour que cela fonctionne sur tous les lecteurs. Je vais l'utiliser moi-même.
zumalifeguard

2

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

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

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


2

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

Si vous êtes familiarisé avec l'administration Windows avancée, vous pouvez utiliser ce package ADM (les instructions sont incluses 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é au type de fichier .ps1 en powershell.exe(utilisez la recherche, il est assez caché) et vous êtes prêt à exécuter des scripts PowerShell avec un double-clic.

Sinon, je recommanderais de m'en tenir à d'autres suggestions car vous pouvez gâcher tout le système avec ces outils d'administration.

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


Une fois installé, vous pouvez trouver ce paramètre dans l '"Éditeur de stratégie de groupe local" sous: Stratégie de l'ordinateur local -> Configuration ordinateur -> Modèles d'administration -> Composants Windows. Là, vous pouvez l'activer et assurez-vous de sélectionner une stratégie dans la liste déroulante qui devient alors activée.
Wouter

1

Vous pouvez utiliser la fonctionnalité Windows «SendTo» pour faciliter l'exécution des scripts PS1. En utilisant cette méthode, vous pouvez faire un clic droit sur un script PS1 et l'exécuter. Cela ne répond pas exactement à la question du PO, mais c'est proche. J'espère que cela sera utile aux autres. BTW .. cela est utile pour une variété d'autres tâches.

  • Localiser / Rechercher Powershell.exe
  • Cliquez avec le bouton droit sur Powershell.exe et choisissez Ouvrir l'emplacement du fichier
  • Cliquez avec le bouton droit sur Powershell.exe et choisissez Créer un raccourci. Enregistrez temporairement un endroit comme votre bureau
  • Vous souhaiterez 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 vers le dossier Sendto
  • Vous devriez maintenant pouvoir faire un clic droit sur un script PS1.
  • Faites un clic droit sur un fichier PS1, sélectionnez l'option contextuelle Envoyer à> Sélectionnez le raccourci Powershell
  • Votre script PS1 doit s'exécuter.

1
En quoi est-ce mieux que l'option de menu contextuel par défaut «Exécuter avec Powershell»?
elBradford

1

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

de 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 voila; un double-clic sur un * .ps1 l'exécutera.


The term '%1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
ajeh

Seule la combinaison de la réponse acceptée avec cette réponse a fonctionné pour moi, une fois que j'ai utilisé la commande de la réponse acceptée dans la clé de registre. Apparemment, il faut courir assoc.
ajeh

@ajeh (désolé pour bieng leet à la fête. Si vous obtenez cette erreur, c'est parce que vous avez des guillemets simples erronés. Assurez-vous d'utiliser UTF-8. (utilisez notepad ++; supprimez les deux chaînes, enregistrez-les en tant que fichier runme.cmd )
Paul Fijma

1

Dans Windows 10, vous pouvez également 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



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.