PowerShellスクリプトをチームに配布しています。スクリプトは、VsphereクライアントからIPアドレスを取得し、mstsc接続を作成して、共有ファイルに記録します。
スクリプトを使用した瞬間、マシンのIPアドレスを知るようになりました。その後、PowerShellスクリプトを実行する代わりに、常にmstscを直接使用する傾向があります。 (彼らはmstscを使用しているので、VMを頻繁に使用しているかどうかはわかりません。)
主に、PowerShellを実行するのは簡単ではないと私に言っています。
私は彼らの怠byにうんざりしています。
.ps1ファイルをダブルクリックしてPowerShellスクリプトを機能させる方法はありますか?
「ターゲット」として次のようなものを使用してショートカットを作成します。
powershell.exe -command "& 'C:\A path with spaces\MyScript.ps1' -MyArguments blah"
または、すべてのPS1ファイルをVBSファイルと同じように機能させたい場合は、次のようにレジストリを編集できます。
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
デフォルト値を次のように編集します...
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -noLogo -ExecutionPolicy unrestricted -file "%1"
その後、希望するすべての.PS1ファイルをダブルクリックするだけです。私の謙虚な意見では、すぐに使えるようになります。
これを「Powershell De-castration Hack」と呼びます。 LOLお楽しみください!
PowerShellのセキュリティ機能の1つは、ユーザーがダブルクリックでスクリプトを起動できないことです。この設定を変更する場合は細心の注意を払ってください。別の方法は、スクリプトをパッケージ化することです。 PrimalScriptのような一部のエディターはそれを行うことができます。ユーザーはPowerShellをインストールする必要がありますが、exeをダブルクリックできます。そして、あなたのチームには少し教育が必要なようです。
私はこれを数年前に書きました(管理者権限で実行します):
<#
.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 {}
}
システム設定の設定は少々難しいかもしれませんが、ハードコードされたパスを必要とするショートカットは理想的ではありません。 batファイルは実際に問題をうまく解決します
RunMyPowershellScript.bat
start powershell -command "& '.\MyPowershellScript.ps1' -MyArguments blah"
このバッチファイルをダブルクリックすると、バッチファイルへのショートカットを簡単に作成でき、スクリプトを任意のフォルダーに展開できます。
レジストリを微調整する必要があります。最初に、HKEY_CLASSES_ROOTのPSDriveを構成します。これは、デフォルトではセットアップされていないためです。このためのコマンドは次のとおりです。
New-PSDrive HKCR Registry HKEY_CLASSES_ROOT
これで、通常のHKCUおよびHKLM PSDriveと同じように、HKEY_CLASSES_ROOTのレジストリキーと値をナビゲートおよび編集できます。
ダブルクリックを設定してPowerShellスクリプトを直接起動するには:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 0
PowerShell ISEでPowerShellスクリプトを開くためのダブルクリックを構成するには:
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Edit'
デフォルト値を復元するには(ダブルクリックしてメモ帳でPowerShellスクリプトを開くように設定します):
Set-ItemProperty HKCR:\Microsoft.PowerShellScript.1\Shell '(Default)' 'Open'
これはWindows 10とPowerShell 5.1でうまくいきました:
レジストリでこれを設定する単純なPowerShellコマンド。
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"'
メモ帳をデフォルトとして再度使用する場合は、値を元に戻します。
同じ名前の.ps1ファイルを使用して、サブフォルダーに単純な.cmdファイルを配置します。たとえば、「foobar」という名前のスクリプトには「foobar.ps1」と「foobar.cmd」が含まれます。 .ps1を実行するには、エクスプローラーから.cmdファイルをクリックするか、コマンドプロンプトから.cmdを実行するだけです。 .cmdファイルは独自の名前を使用して.ps1を自動的に検索するため、同じベース名を使用します。
::====================================================================
:: 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
Pushd/popdを使用すると、スクリプトが置かれている特定のディレクトリに変更することなく、コマンドプロンプトから.cmdファイルを起動できます。スクリプトディレクトリに変更され、完了したら元のディレクトリに戻ります。
スクリプトの終了時にコマンドウィンドウを非表示にする場合は、一時停止を解除することもできます。
.ps1スクリプトにパラメーターがある場合、.NET Formsを使用してGUIプロンプトでそれらのプロンプトを表示しますが、代わりにそれらを渡す場合は、パラメーターを受け入れるためにスクリプトを十分に柔軟にします。この方法で、エクスプローラからダブルクリックするだけで、リストボックスやその他のフォームで必要なものを尋ねられるため、パラメータの詳細を知る必要はありません。
高度なWindows管理に精通している場合は、 このADMパッケージ (このページに説明が含まれています)を使用して、このテンプレートとローカルGPOを介してダブルクリックした後にPowerShellスクリプトを実行できます。この後、.ps1ファイルタイプに関連付けられたデフォルトのプログラムをpowershell.exe
に変更するだけで(検索を使用して、かなり隠されています)、ダブルクリックでPowerShellスクリプトを実行する準備が整います。
そうでなければ、これらの管理ツールでシステム全体を台無しにする可能性があるので、他の提案に固執することをお勧めします。
デフォルト設定は厳しすぎると思います。誰かがあなたのコンピューターに悪意のあるコードを置くことができた場合、彼/彼女はこの制限をバイパスすることもできます(.cmdファイルまたは.exeにラップするか、ショートカットでトリックします)。あなたが書いたスクリプトを実行する簡単な方法から。
Windowsの「SendTo」機能を使用して、PS1スクリプトの実行を簡単にすることができます。この方法を使用すると、PS1スクリプトを右クリックして実行できます。これは、OPの質問に正確に答えているわけではありませんが、近いです。うまくいけば、これは他の人に役立つでしょう。ところで、これは他のさまざまなタスクに役立ちます。
これは、デフォルトで管理者として実行されるスクリプトを使用するために使用するものです:
Powershell.exe -Command "& {Start-Process PowerShell.exe -Verb RunAs -ArgumentList '-File """%1"""'}"
次のデフォルト値としてregeditに貼り付ける必要があります。
HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command
または、これはあなたのためにそれを行うスクリプトです:
$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"""''}"')
これは、KoZm0kNoTの回答に基づいています。ドライブ間で動作するように変更しました。
@echo off
pushd "%~d0"
pushd "%~dp0"
powershell.exe -sta -c "& {.\%~n0.ps1 %*}"
popd
popd
ユーザーのcwdが別のドライブにある場合、2つのpushd/popdsが必要です。外側のセットがないと、スクリプトのあるドライブのcwdは失われます。
ps1
ファイルのデフォルトのファイル関連付けをpowershell.exe
に設定すると、PowerShellスクリプトをダブルクリックして実行できるようになります。
Windows 10では、
ps1
ファイルを右クリックしますOpen with
をクリックしますChoose another app
をクリックしますMore apps
を選択しますLook for another app on this PC
を選択します。C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
を参照して選択します。それはファイルの関連付けを変更し、ps1
ファイルをダブルクリックして実行します。 notepad.exe
をデフォルトのアプリに設定することで、デフォルトの動作に戻すことができます。
これを使用しました(一度だけ実行する必要があります)。また、実行する権限があることを確認してください。
昇格された権限を持つPowerShellから:
Set-ExecutionPolicy=RemoteSigned
次に、batファイルから:
-----------------------------------------
ftype Microsoft.PowerShellScript.1="C:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe" -noexit ^&'%%1'
assoc .ps1=Microsoft.PowerShellScript.1
-----------------------------------------
auto exit: remove -noexit
そして出来上がり。 * .ps1をダブルクリックすると実行されます。
Windows 10では、ファイル拡張子の関連付けに対するWindowsエクスプローラーのオーバーライドを削除することもできます。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
他の回答で言及されたHKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\open\command
変更に加えて。