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?
Erstellen Sie eine Verknüpfung mit so etwas wie "Ziel":
powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
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ß!
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.
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 {}
}
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.
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'
Dies funktionierte für mich unter Windows 10 und Powershell 5.1:
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"'
Setzen Sie den Wert zurück, wenn Sie den Editor wieder als Standard verwenden möchten.
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.
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.
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.
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"""''}"')
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.
Sie können die Standard-Dateizuordnung von ps1
- Dateien auf powershell.exe
Setzen, um ein Powershell-Skript durch Doppelklick auszuführen.
In Windows 10
ps1
- DateiOpen with
Choose another app
More apps
Look for another app on this PC
.C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Und wählen Sie es aus.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.
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.
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.