質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.05%

PowerShellの実行の挙動の違いについて教えてください

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 397

score 1

前提・実現したいこと

PowerShellはド素人です。
あるフォルダを監視して、更新されたら通知を出すコードをWebからコピーして改変しました。
それをVSCode上で実行すると、思惑通りの動きをするのですが、ps1ファイルを右クリックして「PowerShellで実行」すると、PowerShellの画面が起動され、以下の状態になり、エラーは出ないのですが、通知も来ません。
何故なのでしょうか。
ご教授お願いします。

追記

トースト通知を表示する関数を呼び出す部分をコメントアウトしたところ、ログは吐き出されていたので、関数部分がいけないっぽいです。
が、上記の様にVSCode上で実行するときちんとトースト通知が表示されるのです。
どこがいけないのか、見当がつきません。
どなたかお知恵をお貸しください...。

右クリックで実行した際の画面

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      27f52340-c05...                 NotStarted    False                                 ...

該当のソースコード

### SHOW TOAST
function ShowToast {
    [CmdletBinding()]
    PARAM (
        [Parameter(Mandatory=$true)][String] $title,
        [Parameter(Mandatory=$true)][String] $message,
        [Parameter(Mandatory=$true)][String] $detail
    )

    [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
    [Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
    [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null

    $app_id = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\WindowsPowerShell\v1.0\powershell.exe'
    $content = @"
<?xml version="1.0" encoding="utf-8"?>
<toast scenario="reminder">
    <visual>
        <binding template="ToastGeneric">
            <text>$($title)</text>
            <text>$($message)</text>
            <text>$($detail)</text>
            <image placement="appLogoOverride" hint-crop="circle" hint-align="center" src="画像ファイルのパス" />
        </binding>
    </visual>
    <actions>
        <input id="snoozeTime" type="selection" defaultInput="15">
            <selection id="1" content="1 minute"/>
            <selection id="15" content="15 minutes"/>
            <selection id="60" content="1 hour"/>
            <selection id="240" content="4 hours"/>
            <selection id="1440" content="1 day"/>
        </input>
        <action activationType="system" arguments="snooze" hint-inputId="snoozeTime" content="" />
        <action activationType="system" arguments="dismiss" content=""/>
    </actions>
</toast>
"@
    $xml = New-Object Windows.Data.Xml.Dom.XmlDocument
    $xml.LoadXml($content)
    $toast = New-Object Windows.UI.Notifications.ToastNotification $xml
    [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($app_id).Show($toast)
}

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "監視するフォルダパス"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { 
        $path = $Event.SourceEventArgs.FullPath
        $FileName = $Event.SourceEventArgs.Name
        $changeType = $Event.SourceEventArgs.ChangeType

        $msg = "メッセージ"

        ShowToast -title "フォルダ監視" -message $msg -detail $changeType

        $logline = "$(Get-Date), $changeType, $path"
        Add-content "ログファイルのパス" -value $logline
    }

### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    while ($true) {sleep 900}


ソース1:https://superuser.com/questions/226828/how-to-monitor-a-folder-and-trigger-a-command-line-action-when-a-file-is-created
ソース2:https://qiita.com/magiclib/items/12e2a9e1e1e823a7fa5c

補足情報(FW/ツールのバージョンなど)

Name                           Value
----                           -----
PSVersion                      5.1.17763.1490
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17763.1490
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2021/01/29 17:10 編集

    どこからコピーしてきたのかは必ず書きましょう。でなければ著作権侵害という犯罪です。

    キャンセル

  • LOVELESS

    2021/01/29 18:33

    ご丁寧にどうもありがとうございました。

    キャンセル

回答 2

checkベストアンサー

0

質問の流れから外れた回答ですが、BurntToastというライブラリがあります。使ってみてはいかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/02/05 09:08

    せっかくご回答頂いたのですが、会社のPCの為、むやにみ新しくインストールが出来ないので、基本の機能のみを使って実現させる必要があります。
    ご意見ありがとうございました。

    キャンセル

  • 2021/02/06 23:05

    インストールしなくても、ダウンロードしてフォルダを設置するだけでも使えますよ。
    該当するコマンドレットがLovelessさんのスクリプトからアドレス指定で呼び出せればOKなので。

    また、BurntToastの中身はすべてPowershellです。基本の機能しか使っていないです。大丈夫なのではないでしょうか?

    もしくは、BurntToastの中身のコードを参考にするのもありですね。必要な部分のコードを抜き出して実装してみてもいいかもしれません。

    キャンセル

  • 2021/02/18 11:26

    返信があった旨、通知に気づかずお礼が遅れてすみません。
    取り急ぎ返信のお礼です。
    上記、覗いてみますね!

    キャンセル

  • 2021/03/10 09:36

    毎度反応が遅く申し訳ありません。
    BurntToast導入してみましたら、ps1ファイルを右クリックして「PowerShellで実行」でも通知が来るようになりました。
    そもそもの疑問(実行環境による挙動の違い)は解決しておりませんが、とりあえず1歩進みましたので、ありがとうございました!

    キャンセル

0

本来疑問に思っていることは解決しておりませんが、回答がつく気配がありませんし、代替方法を提示いただいので解決済みとします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る