webentwicklung-frage-antwort-db.com.de

Gibt es eine Möglichkeit, ein PowerShell-Skript zum Funktionieren zu bringen, indem Sie auf eine .ps1-Datei doppelklicken?

Ich verteile ein PowerShell-Skript an mein Team. Das Skript ruft eine IP-Adresse vom Vsphere-Client ab, stellt eine mstsc-Verbindung her und protokolliert sie in einer freigegebenen Datei.

In dem Moment, in dem sie das Skript verwendeten, erfuhren sie die IP-Adresse der Maschine. Danach verwenden sie meistens mstsc direkt, anstatt das PowerShell-Skript auszuführen. (Da sie mstsc verwenden, kann ich nicht wissen, ob sie das VM häufig verwenden oder nicht.)

Hauptsächlich sagen sie mir, dass das Ausführen von PowerShell nicht einfach ist.

Ich bin krank von ihrer Faulheit.

Gibt es eine Möglichkeit, ein PowerShell-Skript zum Funktionieren zu bringen, indem Sie auf eine .ps1-Datei doppelklicken?

108
Samselvaprabu

Erstellen Sie eine Verknüpfung mit so etwas wie "Ziel":

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

Wenn Sie möchten, dass alle PS1-Dateien wie VBS-Dateien funktionieren, können Sie die Registrierung folgendermaßen bearbeiten:

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

Ändern Sie den Standardwert so, dass er ungefähr so ​​aussieht ...

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

Dann können Sie einfach auf alle Ihre .PS1-Dateien doppelklicken, wie Sie möchten. meiner bescheidenen Meinung nach in der Lage sein, aus dem Kasten heraus.

Ich werde das "The Powershell De-Castration Hack" nennen. LOL viel Spaß!

67
user3071883

Beachten Sie, dass eine der Sicherheitsfunktionen von PowerShell darin besteht, dass Benutzer Skripts NICHT mit einem Doppelklick starten können. Seien Sie vorsichtig, wenn Sie diese Einstellung ändern. Eine Alternative könnte sein, Ihr Skript zu packen. Einige Editoren wie PrimalScript können das. Die Benutzer müssen noch PowerShell installiert haben, können dann aber auf die EXE-Datei doppelklicken. Und es hört sich so an, als ob Ihr Team ein wenig Bildung braucht.

17
Jeffery Hicks

Ich habe das vor ein paar Jahren geschrieben (mit Administratorrechten ausführen):

<#
.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

Ich bin damit einverstanden, dass das Festlegen einer Systemeinstellung ein bisschen viel sein kann, aber die Verknüpfung, die einen fest codierten Pfad erfordert, ist nicht ideal. Eine Fledermaus-Datei löst das Problem tatsächlich sehr gut

RunMyPowershellScript.bat

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

Diese Batch-Datei kann jetzt doppelt angeklickt werden, Verknüpfungen zur Batch-Datei können einfach erstellt und das Skript in einem beliebigen Ordner bereitgestellt werden.

13
Rick

Sie müssen die Registrierung optimieren. Konfigurieren Sie zunächst ein PSDrive für HKEY_CLASSES_ROOT, da dies nicht standardmäßig eingerichtet ist. Der Befehl dafür lautet:

New-PSDrive HKCR Registry HKEY_CLASSES_ROOT

Jetzt können Sie in HKEY_CLASSES_ROOT genau wie in den regulären HKCU- und HKLM-PSD-Laufwerken nach Registrierungsschlüsseln und -werten suchen und diese bearbeiten.

So konfigurieren Sie das Doppelklicken zum direkten Starten von PowerShell-Skripten:

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

So konfigurieren Sie das Öffnen von PowerShell-Skripten in der PowerShell ISE durch Doppelklicken:

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

So stellen Sie den Standardwert wieder her (Doppelklicken zum Öffnen von PowerShell-Skripten im Editor):

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

Dies funktionierte für mich unter Windows 10 und Powershell 5.1:

  • klicken Sie mit der rechten Maustaste auf die .ps1-Datei
  • Öffnen mit...
  • Wähle eine andere App
  • Kopieren Sie den Speicherort von powershell.exe in die Adressleiste (standardmäßig wird der Windows-Ordner nicht angezeigt), d. H. C:\Windows\System32\WindowsPowerShell\v1.0
  • wählen Sie powershell.exe aus
  • wählen Sie "Immer diese App zum Öffnen von .ps1-Dateien verwenden".
  • oK klicken
10
vizmi

Einfache PowerShell-Befehle, um dies in der Registrierung festzulegen.

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. Navigieren Sie in REGEDIT zu HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell
  2. Doppelklicken Sie im rechten Fensterbereich auf "(Standard)".
  3. Löschen Sie den vorhandenen Wert von "Open" (der Notepad startet) und geben Sie "0" ein (Null, wodurch Powershell direkt gestartet wird).

Setzen Sie den Wert zurück, wenn Sie den Editor wieder als Standard verwenden möchten.

6
gth

legen Sie eine einfache .cmd-Datei in meinen Unterordner und meine .ps1-Datei mit dem gleichen Namen. Ein Skript mit dem Namen "foobar" würde beispielsweise "foobar.ps1" und "foobar.cmd" enthalten. Um die .ps1-Datei auszuführen, muss ich lediglich im Explorer auf die .cmd-Datei klicken oder die .cmd-Datei an einer Eingabeaufforderung ausführen. Ich verwende den gleichen Basisnamen, da die .cmd-Datei automatisch nach der .ps1-Datei sucht, die ihren eigenen Namen hat.

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

Mit pushd/popd können Sie die CMD-Datei über eine Eingabeaufforderung starten, ohne in das Verzeichnis wechseln zu müssen, in dem sich die Skripte befinden. Es wird in das Skriptverzeichnis gewechselt, und wenn der Vorgang abgeschlossen ist, kehren Sie in das ursprüngliche Verzeichnis zurück.

Sie können die Pause auch deaktivieren, wenn das Befehlsfenster nach Beendigung des Skripts ausgeblendet werden soll.

Wenn mein .ps1-Skript Parameter enthält, fordere ich sie mit GUI-Eingabeaufforderungen unter Verwendung von .NET Forms auf, mache die Skripts jedoch auch so flexibel, dass sie Parameter akzeptieren, wenn ich sie stattdessen übergeben möchte. Auf diese Weise kann ich im Explorer einfach darauf doppelklicken und muss die Details der Parameter nicht kennen, da ich mit Listboxen oder anderen Formularen gefragt werde, was ich benötige.

3
KoZm0kNoT

Wenn Sie mit der erweiterten Windows-Verwaltung vertraut sind, können Sie dieses ADM-Paket (Anweisungen finden Sie auf dieser Seite) verwenden und die Ausführung von PowerShell-Skripts nach einem Doppelklick über diese Vorlage und das lokale Gruppenrichtlinienobjekt zulassen. Danach können Sie einfach das mit dem Dateityp .ps1 verknüpfte Standardprogramm in powershell.exe Ändern (verwenden Sie die Suche, sie ist ziemlich verdeckt) und Sie können PowerShell-Skripte mit einem Doppelklick ausführen.

Ansonsten würde ich empfehlen, sich an andere Vorschläge zu halten, da Sie mit diesen Verwaltungstools das gesamte System durcheinander bringen können.

Ich denke, dass die Standardeinstellungen zu streng sind. Wenn es jemandem gelingt, bösartigen Code auf Ihren Computer zu kopieren, kann er diese Einschränkung auch umgehen (in eine .cmd-Datei oder eine .exe-Datei wickeln oder mit einer Verknüpfung tricksen) und alles, was am Ende erreicht wird, ist nur zu verhindern Sie können das Skript, das Sie geschrieben haben, auf einfache Weise ausführen.

2
Jirrick

Sie können die Windows-Funktion "SendTo" verwenden, um das Ausführen von PS1-Skripten zu vereinfachen. Mit dieser Methode können Sie mit der rechten Maustaste auf ein PS1-Skript klicken und ausführen. Dies ist nicht genau die Antwort auf die OP-Frage, aber es ist nah. Hoffentlich ist dies für andere nützlich. Übrigens. Dies ist hilfreich für eine Vielzahl anderer Aufgaben.

  • Suchen Sie nach Powershell.exe
  • Klicken Sie mit der rechten Maustaste auf Powershell.exe und wählen Sie Open File Location
  • Klicken Sie mit der rechten Maustaste auf Powershell.exe und wählen Sie Verknüpfung erstellen. Speichern Sie vorübergehend einen Ort wie Ihren Desktop
  • Möglicherweise möchten Sie standardmäßig als Administrator öffnen. Wählen Sie Verknüpfung> Eigenschaften> Erweitert> Als Administrator öffnen
  • Öffnen Sie den Ordner Sendto. Start> Ausführen> Shell: Sendto
  • Verschieben Sie die Verknüpfung "Powershell.exe" in den Ordner "Sendto"
  • Sie sollten jetzt in der Lage sein, mit der rechten Maustaste auf ein PS1-Skript zu klicken.
  • Klicken Sie mit der rechten Maustaste auf eine PS1-Datei und wählen Sie die Kontextoption "SendTo"> Wählen Sie die Verknüpfung "Powershell"
  • Dein PS1-Skript sollte ausgeführt werden.
2
MrRobot

Folgendes verwende ich, um Scrips standardmäßig als Administrator ausführen zu lassen:

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

Sie müssen dies in regedit als Standardwert für Folgendes einfügen:

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

Oder hier ist ein Skript, das es für Sie erledigt:

$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

Dies basiert auf der Antwort von KoZm0kNoT. Ich änderte es, um über Antriebe zu arbeiten.

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

Die zwei pushd/popds werden benötigt, falls sich der cwd des Benutzers auf einem anderen Laufwerk befindet. Ohne den äußeren Satz geht die CWD auf dem Laufwerk mit dem Skript verloren.

2
zumalifeguard

Sie können die Standard-Dateizuordnung von ps1 - Dateien auf powershell.exe Setzen, um ein Powershell-Skript durch Doppelklick auszuführen.

In Windows 10

  1. Klicken Sie mit der rechten Maustaste auf eine ps1 - Datei
  2. Klicken Sie auf Open with
  3. Klicken Sie auf Choose another app
  4. Wählen Sie im Popup-Fenster More apps
  5. Scrollen Sie nach unten und wählen Sie Look for another app on this PC.
  6. Navigieren Sie zu C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Und wählen Sie es aus.
  7. Listenpunkt

Dadurch wird die Dateizuordnung geändert, und ps1 - Dateien werden ausgeführt, indem Sie darauf doppelklicken. Sie können das Standardverhalten wiederherstellen, indem Sie notepad.exe Auf die Standard-App setzen.

Quelle

1
elBradford

Ich habe dies verwendet (muss nur einmal ausgeführt werden); Stellen Sie außerdem sicher, dass Sie über die folgenden Ausführungsrechte verfügen:

von PowerShell mit erhöhten Rechten:

Set-ExecutionPolicy=RemoteSigned

dann aus einer Fledermausdatei:

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

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

 assoc .ps1=Microsoft.PowerShellScript.1

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

und voila; Ein Doppelklick auf ein * .ps1 führt es aus.

1
Paul Fijma

In Windows 10 möchten Sie möglicherweise auch die Außerkraftsetzung von Windows Explorer für die Dateierweiterungszuordnung löschen:

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

zusätzlich zu HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command Änderung in anderen Antworten erwähnt.

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

1
Chris Xue