フィクションの過剰摂取

私のようにフィクションを様々な媒体で過剰に摂取すると何が起こるか?
結論を言うと、「フィクションを純粋に楽しめなくなる」
物語のオチがなんとなく解ってしまうようになる。

良いフィクションというのはある程度大昔からあるセオリーに則っているので、そのセオリーを感じ取ってしまうのです。
ラスボスがどういうやつだとか、
黒幕は誰であるとか、
主人公が実は...とか、

それでも、つらいつらいノンフィクションを癒やしてくれるのはいつだってフィクションなので、フィクションの摂取はやめられないのです。

管理者権限は万能権限ではない

はじめに

俺は木っ端エンジニア!何でもかんでも管理者権限で実行させれば万事解決って思っていたよ!
今日までは。

何があった?

お家PCではTablacus Explorerというフリーソフトを使っています。
非常に便利なのですが、PCを再起動する度にNASに割り当てたドライブレターが外れてしまうことが欠点でした。

どうした?

Tablacus Explorerを管理者権限で実行していると、Windows11 に備え付けのエクスプローラで割り当てたNASとの齟齬を引き起こし、都度再割当てが必要になる...という仕組みでした。
つまり、Tablacus Explorerを非管理者権限で起動すると、NASを正常に認識するようになりました。

おわりに

権限は適切に使い分けよう!!

7-Zipで解凍後にアーカイブをゴミ箱に移動する機能のスクリプト

はじめに

チャッピーといっしょに4時間でつくった。

経緯

困っていること

クライアントからPPAPで仕事用のZIPファイルが送られてくる。
厳密にはPPAPではなく「パスワードはいつものです」というガバガバ秘伝のタレセキュリティ。
会社ではインストールできるフリーソフトに制限がかけられている。こっちはガチガチセキュリティ。
解凍したらアーカイブファイルを削除する機能を持った解凍ソフトはインストール不可。
家でも使っているけど、それだと解凍できないアーカイブが7-Zipだと解凍できたりする。
なので7-Zip単体で運用できる、かゆいところに手が届くスクリプトをつくりたい。

機能

解凍が成功したらアーカイブをゴミ箱に移動させる。
過去に入力したアーカイブのパスワードを控えておいて、先にそれで試してからパスワードを入力させる。
ファイル名は日本語や半角スペースに対応させる。
2重フォルダを回避する。
アーカイブはまとめて右クリックから処理できる。
処理は並列ではなく直列に1つ1つ処理する。
何らかの形で進捗を出力し、処理が動いている感を出す。(フリーズしていると思わせない)

成果物

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName Microsoft.VisualBasic

$SevenZip = "C:\Program Files\7-Zip\7z.exe"
$PwFile   = "<your_pw_cache_txt_file_path>"

# 保存済みパスワード読み込み
$Passwords = @()
if (Test-Path $PwFile) { $Passwords = Get-Content $PwFile | Where-Object { $_ -ne "" } }

# ファイルが渡されているか確認
if ($args.Count -eq 0) {
    [System.Windows.Forms.MessageBox]::Show(
        "ファイルが渡されていません。",
        "解凍中止"
    ) | Out-Null
    exit
}

# ------------------------
# 解凍関数(成功判定強化)
# ------------------------
function Try-Extract($ArchivePath, $Password) {

    Write-Host "[$ArchivePath] 解凍開始..."

    $parentDir = [System.IO.Path]::GetDirectoryName($ArchivePath)
    $baseName  = [System.IO.Path]::GetFileNameWithoutExtension($ArchivePath)
    $OutputDir = Join-Path $parentDir $baseName

    # 毎回クリーンにする(誤判定防止)
    if (Test-Path -LiteralPath $OutputDir) {
        Remove-Item -LiteralPath $OutputDir -Recurse -Force
    }

    New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null

    $argsList = @(
    "x",
    "-y",
    "-bsp1",
    "-o`"$OutputDir`"",
    "`"$ArchivePath`""
    )

    if ($Password) {
        $argsList += "-p$Password"
    } else {
        $argsList += "-p-"   # ←これが超重要
    }

    & "$SevenZip" @argsList | Out-Host

    # ✔ 成功判定(重要)
    $hasFiles = (Get-ChildItem -LiteralPath $OutputDir -Recurse -ErrorAction SilentlyContinue).Count -gt 0
    return ($LASTEXITCODE -eq 0 -and $hasFiles)
}

# ------------------------
# 成功後処理(二重フォルダ対応)
# ------------------------
function OnSuccess($ArchivePath, $OutputDir) {

    # ゴミ箱へ
    [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile(
        $ArchivePath,
        'OnlyErrorDialogs',
        'SendToRecycleBin'
    )

    # 二重フォルダ回避
    $subItems = Get-ChildItem -LiteralPath $OutputDir
    if ($subItems.Count -eq 1 -and $subItems[0].PSIsContainer) {
        $inner = $subItems[0].FullName
        Get-ChildItem -LiteralPath $inner | Move-Item -Destination $OutputDir -Force
        Remove-Item -LiteralPath $inner -Recurse -Force
    }
}

# ------------------------
# メイン処理
# ------------------------
foreach ($ArchivePath in $args) {

    if (-not (Test-Path -LiteralPath $ArchivePath)) { continue }

    $parentDir = [System.IO.Path]::GetDirectoryName($ArchivePath)
    $baseName  = [System.IO.Path]::GetFileNameWithoutExtension($ArchivePath)
    $OutputDir = Join-Path $parentDir $baseName

    $extracted = $false

    # ① パスワードなし
    if (Try-Extract $ArchivePath $null) {
        OnSuccess $ArchivePath $OutputDir
        $extracted = $true
    }

    # ② 保存済みパスワード
    if (-not $extracted) {
        foreach ($pw in $Passwords) {
            if (Try-Extract $ArchivePath $pw) {
                OnSuccess $ArchivePath $OutputDir
                $extracted = $true
                break
            }
        }
    }

    # ③ GUI入力
    while (-not $extracted) {

        $pw = [Microsoft.VisualBasic.Interaction]::InputBox(
            "パスワードを入力してください`n$ArchivePath",
            "解凍パスワード",
            ""
        )

        if ([string]::IsNullOrEmpty($pw)) { break }

        if (Try-Extract $ArchivePath $pw) {

            if ($Passwords -notcontains $pw) {
                Add-Content -Path $PwFile -Value $pw
            }

            OnSuccess $ArchivePath $OutputDir
            $extracted = $true

        } else {

            [System.Windows.Forms.MessageBox]::Show(
                "パスワードが違います",
                "解凍失敗"
            ) | Out-Null
        }
    }
}

使い方

7zip_extract.ps1みたいな適当な名前で上記のコードを保管。
ショートカットを%APPDATA%\Microsoft\Windows\SendToに配置。
あとはアーカイブを右クリック→送る→ショートカット をクリック。
ショートカットにすることで好きなアイコンも設定できる。

追記

2026/03/13 パスワード入力GUIが開かなかったので修正
2026/03/17 保存済みパスワードzipが開かなかったので修正 今度こそ大丈夫なはず...