wingetでzip入りポータブルアプリのインストールをやる

RC版となったwinget 1.4.3531が出たので、zipのポータブルアプリインストールを試してみました

マニフェストの設定

以前書いたマニフェストをコピーしてuwscr 0.9.0用にしていきます
前回はmsiでしたが今回はzipなので、それに対応してマニフェストを書き換えていきます
zipインストールについてはここに書かれています
マニフェストの項目が増えてますね、やってみましょう

InstallerTypeの設定

zipにします
その場合NestedInstallerTypeが必須になるとのことなので次はそれを設定します

NestedInstallerTypeの設定

schemaで入力候補が表示されるのでそれを見てるとportableがあったので、それにします
schemaはhttps://aka.ms/winget-manifest.installer.1.4.0.schema.jsonにしています

インストールを試す

winget install -m path\to\manifest_file

-mを付けてマニフェストファイルのパスを指定することでローカルにあるマニフェストを元にインストールできます
が、失敗しました…
NestedInstallerFilesがないとだめなようです

NestedInstallerFilesの設定

NestedInstallerFilesを入力するとschemaの働きにより直下にRelativeFilePathというのが生えてきます
これはインストールしたいファイルの相対パスを入力すれば良いっぽいですね
uwscr.exeがzipファイル直下に入ってるので、uwscr.exeとだけ書きます

改めてインストールを試す

インストールできました!

uwscr.exeが (表向きは) %LOCALAPPDATA%\Microsoft\WinGet\Links にインストールされます
同時にこのディレクトリのパスがユーザー環境変数に追加されます
このディレクトリはPATHを通すためのもののようで、ポータブルアプリのシンボリックリンクが置かれるようです
プロセス環境変数には追加されないので、一旦シェルを再起動しましょう

実行してみる

PS> cmd /c uwscr --version
uwscr 0.9.0
PS> gcm uwscr

CommandType     Name         Version    Source
-----------     ----         -------    ------
Application     uwscr.exe    0.9.0.0    C:\Users\stuncloud\AppData\Local\Microsoft\WinGet\Links\uwscr.exe

よかったですね
winget1.4がリリースされたら正式に対応したいと思います

マニフェストファイル

実際に使ったマニフェストファイルは以下になります

# Created with YamlCreate.ps1 v2.1.2 $debug=NVS0.7-2-3
# yaml-language-server: $schema=https://aka.ms/winget-manifest.installer.1.4.0.schema.json
PackageIdentifier: stuncloud.uwscr
PackageVersion: 0.9.0
InstallerLocale: ja-JP
MinimumOSVersion: 10.0.0.0
InstallerType: zip
NestedInstallerType: portable
NestedInstallerFiles:
– RelativeFilePath: "uwscr.exe"
# Scope: user
UpgradeBehavior: install
FileExtensions:
– uws
– uwsl
– uwsr
Installers:
– Architecture: x64
InstallerUrl: https://github.com/stuncloud/UWSCR/releases/download/0.9.0/UWSCRx64.zip
InstallerSha256: D3FCF2CF61CBE51BD6F033960F516CE9EAEACB8961B5C13BAFC2C4E9C5DBD78B
– Architecture: x86
InstallerUrl: https://github.com/stuncloud/UWSCR/releases/download/0.9.0/UWSCRx86.zip
InstallerSha256: 93A09F86598079A78525091249472A7EE21AA41DFB7FFA828980FEECFED6B039
ManifestType: installer
ManifestVersion: 1.4.0
# Created with YamlCreate.ps1 v2.1.2 $debug=NVS0.7-2-3
# yaml-language-server: $schema=https://aka.ms/winget-manifest.defaultLocale.1.4.0.schema.json
PackageIdentifier: stuncloud.uwscr
PackageVersion: 0.9.0
PackageLocale: ja-JP
Publisher: stuncloud
PublisherUrl: https://github.com/stuncloud/
# PublisherSupportUrl:
# PrivacyUrl:
Author: stuncloud
PackageName: UWSCR
PackageUrl: https://github.com/stuncloud/UWSCR/
License: NotAvailable
# LicenseUrl:
Copyright: stuncloud
# CopyrightUrl:
ShortDescription: UWSC互換スクリプト実行ツール
# Description:
# Moniker: uwscr
Tags:
– automation
– uwsc
# Agreements:
# ReleaseNotes:
ReleaseNotesUrl: https://github.com/stuncloud/UWSCR/releases/tag/0.9.0
ManifestType: defaultLocale
ManifestVersion: 1.4.0
# Created with YamlCreate.ps1 v2.1.2 $debug=NVS0.7-2-3
# yaml-language-server: $schema=https://aka.ms/winget-manifest.version.1.4.0.schema.json
PackageIdentifier: stuncloud.uwscr
PackageVersion: 0.9.0
DefaultLocale: ja-JP
ManifestType: version
ManifestVersion: 1.4.0

うちの$PROFILEの話

PowerShellの$PROFILEの肥大化がいよいよまずい感じになってきました
ちょっと整理せにゃならんということで、現時点で何やってるかをまとめましょう

なおうちの$PROFILEはWindows PowerShellおよびPowerShell (Core)で共用です
厳密に言うとgitで管理してる$PROFILEを含むディレクトリが別にあり

  • ~\Documents\WindowsPowerShell
  • ~\Documents\PowerShell

がそれぞれJunctionです
なので$PROFILEはWindows PowerShellでも動く構文で書かないといけない

$PROFILEでやってること

今見たら空行含めて508行ありました
おおよそ

  • prompt定義
  • プラットフォーム別処理
  • PC別処理
  • Windows PowerShell対策
  • PSReadLine設定
  • その他

みたいになってるはずです

続きを読む

PowerShellでClearScriptでV8やる

やりました
それゆえにPowerShellでモダンなJavaScriptが動きます

概要

  1. ClearScriptぽいものをnugetしていく
  2. ClearScriptぽいものをAdd-Type
  3. [Microsoft.ClearScript.V8.V8ScriptEngine]::new()していろいろやる

導入

わかりやすさのためにnuget.exeをしますが実用を求めるなら各自いい感じにしてください

  1. nuget.exeをダウンロード
PS> Invoke-RestMethod -Uri https://dist.nuget.org/win-x86-commandline/latest/nuget.exe -OutFile nuget.exe
  1. ClearScriptのV8に必要なものをダウンロード
PS> .\nuget.exe install Microsoft.ClearScript.V8
PS> .\nuget.exe install Microsoft.ClearScript.V8.Native.win-x64
  1. ちょっとファイルを移動する(※)
PS> gi .\Microsoft.ClearScript.V8.Native.win-x64.7.1.2\runtimes\ | copy -Destination .\Microsoft.ClearScript.V8.7.1.2\lib\net5.0\ -Recurse
  1. Add-Typeする
Add-Type -Path .\Microsoft.ClearScript.Core.7.1.2\lib\net5.0\ClearScript.Core.dll
Add-Type -Path .\Microsoft.ClearScript.V8.7.1.2\lib\net5.0\ClearScript.V8.dll

やる

PS> $v8 = [Microsoft.ClearScript.V8.V8ScriptEngine]::new()
# ※をやっとかないとここでエラーになる

PS> $v8.Execute('let foo = {"bar":1};')
PS> $v8.Evaluate('foo').bar
1

できました

PowerShellで任意の型に拡張メソッド的なやつを生やす

はい
拡張メソッドはPowerShellで使えませんね、悲しいことに
拡張メソッドといえば有名なのはLINQです
まぁでもLINQでやるようなことはselectやwhereにパイプすれば解決します
なのでそうね、これはなくても良い

でもなんかこうね
なにかPowerShellでやろうとしててC#の実装参考にしてるとき
拡張メソッド出てくるとムキー!てなったりしがちです

はい
しかし今回は拡張メソッドまるでぜんぜん関係ありません!

続きを読む

PowerShellで音楽を鳴らそう

PCに向かい合う日々がやや続いたり続かなかったりする昨今
作業中にBGMが欲しいじゃあないですか

しかしデスクトップではおおよそ

  • Windows Terminal
  • VSCode
  • ブラウザ

を激しく行き来しており音楽プレイヤー系のアプリケーションを触っている暇などない
という問題にぶち当たります、当然ですよね

なのでPowerShellから触れる音楽プレイヤーがあれば楽なのではないか
PowerShellならWindows TerminalとVSCodeから触れるわけで
ということで当初CUIな音楽プレイヤーを探していましたが
ちょっと用途と異なってたのでやめました
ほしいのはコマンド叩いて再生、停止のコントロールができるやつなんだ

理解しましたね
では自作しましょう

続きを読む