none
$PSVersionTableや$myInvocation.ScriptNameがNULLに RRS feed

  • 質問

  • Windows8.1 x64です。

    デスクトップに保存した.ps1ファイルをISEで開いています。

    <#
    $PSVersionTable
    
    PSVersion 4.0
    WSManStackVersion 3.1
    SerializationVersion 1.1.0.1
    CLRVersion4.0.30319.36366
    BuildVersion 6.3.9600.17400
    PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
    PSRemotingProtocolVersion 2.2
    #>
    
    <# スクリプトのPath取得 #>
    [string]$cdir = Split-Path ( & { $myInvocation.ScriptName } ) -parent
    $cdir
    
    $PSScriptRoot

    Split-Path : 引数が空の文字列であるため、パラメーター 'Path' にバインドできません。

    とエラーになるのと、$PSScriptRootもNULLのようで、何も表示されません。

    どのような記述でスクリプトのパスを取得できるようでしょうか。

    2017年4月28日 0:24

すべての返信

  • スクリプトファイルを保存した状態で、そのスクリプトを実行されていますでしょうか。

    つまり、ISEコンソール上で、例えば

    PS C:\> C:\Users\ユーザー名\Desktop\スクリプト.ps1

    のように、保存されたps1ファイルが正しく実行されていますでしょうか。

    未保存のファイルを実行したり、スクリプトの内容をコンソール部分にコピペして実行すると、$myInvocation.ScriptNameや$PSScriptRootはnullになります。

    2017年4月28日 5:15
    モデレータ
  • デスクトップに保存してあるps1ファイルを開き、スクリプトウィンドウにスクリプトが表示されている状態で[F5]を押下しています。

    スクリプトウィンドウでは失敗するものなのでしょうか。

    2017年4月28日 5:59
  • 問題ないはずなのですが、おかしいですね?

    Windows 8.1(PowerShell 4.0)、Windows 10(PowerShell 5.1)の環境で、ご提示のスクリプトをデスクトップに保存し、ISEで開いたのちF5キー押下で実行してみました。

    当方の環境ではどちらも問題なくパスが取得できました。

    2017年4月28日 8:19
    モデレータ
  • スクリプトファイル内に、

    $myInvocation

    とだけ記述した場合、ISEで実行すると何が出力されますか?

    仮に何も出力されないとすれば、自動変数が、モジュールやプロファイル等の何者かに上書きされているのかもしれません。


    2017年4月28日 8:27
    モデレータ
  • 下記のように出力されます。

    BoundParameters       : {}
    UnboundArguments      : {}
    ScriptLineNumber      : 0
    OffsetInLine          : 0
    HistoryId             : 41
    ScriptName            :
    Line                  :
    PositionMessage       :
    PSScriptRoot          :
    PSCommandPath         :
    InvocationName        :
    PipelineLength        : 2
    PipelinePosition      : 1
    ExpectingInput        : False
    CommandOrigin         : Runspace
    DisplayScriptPosition :

    2017年4月28日 8:32
  • CommandOriginがRunspaceになっていますね。

    もしかするとローカルにあるスクリプトファイルを、リモートで実行しようとしていませんか?

    その場合、ローカルのスクリプトファイルの内容がコピーされ、リモートではコピーされた文字列が実行されるので、ファイル名の情報は消失してしまいます。

    2017年4月28日 8:40
    モデレータ
  • デスクトップのps1ファイルを右クリックし、「編集」を選択しています。

    そこでISEが開き、[F5]を実行しているだけなのですが・・・

    2017年4月28日 8:44
  • 素に近い状態のWindows 8.1+PowerShell4.0で実行した場合の画面キャプチャを示します。

    (ExecutionPolicyを変更した程度です)

    デスクトップ上の「パス取得.ps1」を右クリックし、メニューの「編集」を選択し、ISEを開いています。その後F5キーを押下した直後の状態です。

    この画面と比べると何か気になる違いはありますか?

    もし同じようにキャプチャしていただければ何かわかるかもしれません。

    いずれにせよ、素に近い状態では問題なく実行可能ですので、そちらの環境に何かトラブルが起きている可能性は否定できないものと思います。

    2017年4月28日 9:07
    モデレータ
  • [ファイル]-[開く]からps1を開いて実行した場合、正しく結果が返りました。

    基本を理解していないようです。

    ご教示いただき、ありがとうございました。

    2017年4月28日 9:26