タグ: Powershell

  • PowerShell ISEでps1のファイルを開くと文字化けする

    Windows10のPowerShell ISEで、ps1ファイル(PowerShellのスクリプトファイル)を開くと、文字化けする。日本語のコメント部分が文字化けするので使いにくい。対処方法を調べてみたのだが。

    PowerShell ISEの読み込み時のデフォルトの文字コードは、ShiftJISである。この読み込み時のデフォルトの文字コードを変更することはできない。OSの文字コードではなくて、PowerShell ISEのデフォルト設定であるため。

    ps1ファイルに、BOM付でUTF-8指定されている場合には、開いても文字化けせず、UTF-8としてファイルを開いてくれる。

    Windows10は、現在はメモ帳などで作成したファイルにBOMを付けていない。デフォルトはUTF-8で、BOMなしはUTF-8解釈されるし、それで保存される。

    PowerShellのスクリプトファイルを作成するときは、保存するときに拡張子を .ps1 で保存するだけではなく、オプションとして、BOMで文字コードをUTF-8指定で保存する必要がある。もし、.ps1ファイルをPowerShell ISEで開くときに文字化けする場合は、一度、メモ帳などで開き、BOM付で保存しなおす必要がある。

    なんと厄介な。Powershell ISE は標準でインストールされているので実行時したりするときに便利だったのだけど。

  • Powershellでプロレスのスレッド数をカウントするコマンド

    Powershellでコマンドレットを組み合わせて、Windows上で実行されているスレッドの数を確認する。

    Get-Process だけを実行すると、プロセス名がわかるので、そのプロセス名で絞り込むこともできる。

    例) Windows上で動作しているスレッド数をカウントするコマンドレット

    (Get-Process|Select-Object -ExpandProperty Threads).Count

    例) Windows上で動作しているプロセスのJavaで起動されているスレッド数をカウントするコマンドレット

    (Get-Process Java |Select-Object -ExpandProperty Threads).Count

    例) Windows上で動作しているプロセスのTomcatで起動されているスレッド数をカウントするコマンドレット

    (Get-Process Tomcat9 |Select-Object -ExpandProperty Threads).Count

    おまけ:例)プロセスの数をカウントするコマンドレット

    (Get-Process).count
  • Powershellでless +Fっぽいことをやる

    Windowsで、テキスト形式のログをリアルタイムで確認したくて、”less +F” や “tail -f” のようなものがないかと調べていたら、Powershellでできるとのこと。

    Get-Content -Path ログファイル -wait -tail 0

    止めるときは、「Ctrl + C」で止める。

    もし、文字化けが発生する場合には、「-encoding utf8」(utf8の部分は適切な文字コードに変える)を付けて実行する。

    使ってみたが、便利。問題はコマンドを忘れそうなこと。

    参考: https://saoline.co/wordpress/?p=1182

  • .NET6のランタイムがインストールされているか調べる方法

    .NET6 のアプリケーションを動作させるために、Windowsに「.NET6のランタイム」がインストールされているかを調べた。同じ方法で、「.NET core」のランタイムがインストールされているかも調べることができる。(.NET6 は、Core系の系譜なので)

    ランタイムがインストールされているかどうかは、Powershellを開いて、下記のコマンドを実行する。

     dotnet --list-runtimes

    .NETのランタイムがインストールされていないときは、dotnetコマンドがエラーになる。dotnetコマンドが正常に実行されれば、ランタイムのリストが表示される。

    .NET6などのランタイムがインストールされているときの例)

    PS C:\>  dotnet --list-runtimes 
    Microsoft.AspNetCore.App 3.1.23 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 3.1.25 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 5.0.10 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 5.0.15 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 6.0.3 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.AspNetCore.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App] 
    Microsoft.NETCore.App 3.1.23 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 3.1.25 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 5.0.10 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 5.0.15 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 6.0.3 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.NETCore.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 
    Microsoft.WindowsDesktop.App 3.1.23 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 3.1.25 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 5.0.10 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 5.0.15 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 5.0.17 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 6.0.0 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 6.0.3 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    Microsoft.WindowsDesktop.App 6.0.5 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App] 
    PS C:\>

    .NET6などのランタイムがないときの例)

    PS C:\>  dotnet --list-runtimes 
    dotnet : 用語 'dotnet' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されま 
    せん。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してく 
    ださい。 
    発生場所 行:1 文字:2 
    +  dotnet --list-runtimes 
    +  ~~~~~~ 
        + CategoryInfo          : ObjectNotFound: (dotnet:String) [], CommandNotFoundException 
        + FullyQualifiedErrorId : CommandNotFoundException 
    PS C:\>

  • Windows10の空き容量をコマンドで表示する

    Powershellか、コマンドプロンプトで、fsutilコマンドを使うと、空き容量がわかる。GUIが使えない環境では楽。

    PS C:\Users\zen> fsutil volume diskfree c:\
    空きバイト総数        :  39,843,536,896 ( 37.1 GB)
    バイト総数             : 254,863,732,736 (237.4 GB)
    クォータの空き領域の合計バイト数  :  39,843,536,896 ( 37.1 GB)
    PS C:\Users\zen> 

    Windows10じゃなくて、Windows Server系でも同じコマンドで空き容量をしることができる。

  • PowerShell 7.1をインストールした

    PowerShell 7.1がMicrosoft Storeから入手できるようになったので、インストールした。Microsoft Storeで、PowerShellと検索して、Microsoft Corporationが公開しているものを選択して、入手をクリックするだけ。Powershell 7.0が自分でインストーラーをダウンロードしてインストールしていたのに比べるとかなり便利。これで、新しいバージョンの配布もされるだろうから、先々を考えると、ストアからの配信はありがたい。

    Microsoft StoreからPowerShell 7.1をインストールしたところ、Windows 10上には、最初からインストールされていたWindows PowerShell、手動でインストールしたPowerShell 7.0、ストアからインストールしたPowerShell 7.1の3つが混在するようになった。使うときに間違えないようにしないといけない。

    あと、どこかでPowerShell 7.0のアンインストールをしないと穴になってしまう。

  • デプロイしたアプリにアクセスしたら ”HRESULT からの例外:0x801310“ が発生した

    ASP.NET(MVC5)で作成したアプリを変更してデプロイした。デプロイ後、Invoke-WebRequestでアクセスしたところ、アプリケーションエラーが発生した。エラー内容は下記。

    Invoke-WebRequest : '/API' アプリケーションでサーバー エラーが発生しました。
    ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicK
    eyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はア
    センブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
    説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所について
    は、スタック トレースを参照してください。
    例外の詳細: System.IO.FileLoadException: ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform,
    Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見
    つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
    ソース エラー:
    現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の
    例外スタック トレースを使って確認できます。
    アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1
    .0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' を読み込めなかった原因を調べるのに役立ちます。
    警告: アセンブリ バインドのログ記録がオフにされています。
    アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1
    に設定してください。
    注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。
    この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。
    スタック トレース:
    [FileLoadException: ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Cult
    ure=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリの
    マニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)]
       System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly
    , StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
       System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly
    , StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +96
       System.Type.GetType(String typeName) +62
       System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +15
       System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2406
       System.Web.Configuration.CompilationSection.get_RecompilationHash() +110
       System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +551
       System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +59
       System.Web.Compilation.BuildManager.ExecutePreAppStart() +155
       System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMap
    PathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception ap
    pDomainCreationException) +746
    [HttpException (0x80004005): ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.
    1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセ
    ンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)]
       System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +552
       System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +122
       System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +737
    バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.8.4075.0
    発生場所 行:1 文字:1
    + Invoke-WebRequest http://xxxx:8080/api/xxxxCopy/
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExce
        ption
        + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
    

    Visual Studioで開発してテストしていると何も問題がなかった。原因は、Web.configをデプロイしていなかったこと。Visual Studioの環境や.Net Framework 4.8の環境は、毎月更新されていく。その環境でコンパイルしたときに、もともとのWeb.configに記載された情報と新しくコンパイルされたものの情報が異なった。そのために、実行時にエラーになった。解決策としては、新しくコンパイルした方のWeb.configを使うこと。環境に合わせて変更する必要があれば変更する。

  • Powershell上からSSH接続するとコネクションが切れる問題の対処

    Windows10のPowershell上からSSH接続して、ちょっと放置するとコネクションが切れている。Windows Terinalを入れてから、結構、Powershell上からSSH接続することが増えたので、簡単にきれてしまうのは辛い。

    packet_write_wait: Connection to xxx.xxx.xxx.xxx port 22: Connection aborted
    

    すぐに切れないようにするために、下記の設定をクライアント側でおこなった。これで定期的に通信を行って、コネクションを維持する。

    1. 下記のフォルダを開く。「.ssh」のフォルダは、一度、SSHで外部に接続していれば、「known_hosts」ファイルができているので、フォルダもある。

    C:\Users\アカウント名\.ssh\

    2. 「config」というファイルを作る(既にあれば、つくらない)

    3. 「config」のファイルに、以下を書き込む。内容としては、300秒おきに、アライブの信号を送る。それを最大10回行う。

    ServerAliveInterval 300
    ServerAliveCountMax 10
    

    Windows10だけど、SSHの設定がLinuxのような感じでできるのはよい。

  • コマンドから管理者モードでWindows Terminalを起動する

    コマンドラインから、Windows Terminal、Powershell、コマンドプロンプトを起動させるときのコマンドのメモ。Powershellのオプションを使って、起動するので、コマンドが長い。実際には、エリアスに登録しておくのがよい。

    ■Windows Terminalを管理者権限で起動する。

    powershell start-process wt -verb runas
    
    

    ■コマンドプロンプトを管理者権限で起動する

    powershell start-process cmd -verb runas
    
    

    ■Powershellを管理者権限で起動する

    powershell start-process wt -verb runas
    
    

  • Powershellでパフォーマンスカウンタを取得する

    Powershellでパフォーマンスカウンタを取得するには、Get-Counter コマンドレットを使用する。

    Get-Counter だけで、ローカルのカウンタ値が取れる。最初に実行し、取得したい値のカウンタ値を取るとよい。

    例)CPUのカウンタを指定すると、その値だけ取得できる。

    Get-Counter "\\pcXXX\processor(_total)\% processor time"
    

    例)CPUのカウンタ値を、10秒置きに、継続的に取得する

    Get-Counter "\\pcXXX\processor(_total)\% processor time" -Continuous -SampleInterval 10
    

    例)他のコンピュータのカウンタ値を取得する(このとき、実行ユーザがリモート先の権限をもっている必要がある、ファイアウォールも通過できる設定になっている必要がある)

    Get-Counter -ComputerName SERVERxx