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?
Créez un raccourci avec quelque chose comme ceci comme "cible":
powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
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!
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.
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 {}
}
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.
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'
Cela a fonctionné pour moi sur Windows 10 et PowerShell 5.1:
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"'
Annulez la valeur si vous souhaitez utiliser à nouveau le Bloc-notes par défaut.
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.
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.
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.
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"""''}"')
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.
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,
ps1
fichierOpen with
Choose another app
More apps
Look for another app on this PC
.C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
.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.
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.
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.