PowerShellでスクリプトを実行するとセキュリティエラーになるときの対策

対策

次のコマンドを実行します。

> Set-ExecutionPolicy Unrestricted -Scope CurrentUser

または

> Set-ExecutionPolicy Bypass -Scope CurrentUser

解説

PowerShellでスクリプトを実行すると、次のようなエラーになることがあります。

> nodist -v
nodist : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files (x86)\Nodist\bin\nodist.ps1
を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170
) を参照してください。
発生場所 行:1 文字:1
+ nodist -v
+ ~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess

このエラーが発生する理由は、PowerShellの実行ポリシーにあります。
既定の実行ポリシーは”Restricted”で、これは制限の厳しいポリシーです。

ポリシーには次のものがあります。

  • Restricted
  • AllSigned
  • RemoteSigned
  • Unrestricted
  • Bypass
  • Undefined

各ポリシーの詳細は「about_Execution_Policies」を御覧ください。

現在のポリシーは次のコマンドで確認できます。

> Get-ExecutionPolicy
Restricted

実行ポリシーを変更するには、次のコマンドを実行します。

> Set-ExecutionPolicy 設定するポリシー -Scope CurrentUser

例えば、ポリシーをBypassに変更するときは次のコマンドを実行します。

> Set-ExecutionPolicy Bypass -Scope CurrentUser

node.jsでパスの操作

node.jsでパスを操作するサンプルコードです。

実行結果は、Windowsで実行したときのものです。

絶対パスに変換する

const path = require('path');

const dir = path.resolve('C:/temp/path/sample.txt', '../dat');
console.log(dir); // => C:\temp\path\dat

相対パスを取得する

fromからtoへの相対パスを取得します。

const path = require('path');

const from = 'C:/temp/path/sample.txt';
const to = 'C:/temp/foo/bar';
console.log(path.relative(from, to)); // => ..\..\foo\bar

パスを分解する

const path = require('path');

const filename = 'C:/temp/path/sample.txt';

// ディレクトリ名を取得する
console.log(path.dirname(filename)); // => C:/temp/path

// ファイル名を取得する
console.log(path.basename(filename)); // => sample.txt

// ファイル名から拡張子を削除する
console.log(path.basename(filename, path.extname(filename))); // => sample

// 拡張子を取得する
console.log(path.extname(filename)); // => .txt

まとめて取得できます。

const path = require('path');

const parsedPath = path.parse('C:/temp/path/sample.txt');
console.log(parsedPath.root); // => C:/
console.log(parsedPath.dir); // => C:/temp/path
console.log(parsedPath.base); // => sample.txt
console.log(parsedPath.ext); // => .txt
console.log(parsedPath.name); // => sample

絶対パスかどうかを判定する

const path = require('path');

console.log(path.isAbsolute('/foo/bar')); // => true
console.log(path.isAbsolute('C:/foo/..')); // => true
console.log(path.isAbsolute('foo/bar')); // => false

パスを結合して、正規化したパスを取得する

const path = require('path');

console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '..')); // => \foo\bar\baz\asdf
console.log(path.join('C:/foo', 'bar', '..', 'baz')); // => C:\foo\baz

パスを正規化する

const path = require('path');

console.log(path.normalize('/foo/bar//baz/asdf/quux/..')); // => \foo\bar\baz\asdf
console.log(path.normalize('C:\\temp\\\\foo\\bar\\..\\')); // => C:\temp\foo\

Xamarin.MacでMacOSのバージョンを調べるには

OSのバージョンによって使用するAPIを変えたいとき、OSのバージョンを確認する必要があります。

MacOSのバージョンを確認する方法を紹介します。

MacOSのバージョンを取得する

/// <summary>
/// MacOSのバージョンを取得します
/// </summary>
private static string GetVersion()
{
    var version = NSProcessInfo.ProcessInfo.OperatingSystemVersion;
    StringBuilder sb = new StringBuilder();
    sb.AppendLine($"Major: {version.Major}");
    sb.AppendLine($"Minor: {version.Minor}");
    sb.AppendLine($"PatchVersion: {version.PatchVersion}");
    return sb.ToString();
}

MacOSのバージョンが指定バージョンより新しいか

/// <summary>
/// MacOSのバージョンが指定バージョンより新しければtrue
/// </summary>
private static bool IsLaterVersion(int major, int minor, int patchVersion)
{
    var version = new NSOperatingSystemVersion(major, minor, patchVersion);
    return NSProcessInfo.ProcessInfo.IsOperatingSystemAtLeastVersion(version);
}

サンプルアプリケーション

こちらからサンプルアプリケーションをダウンロードできます。

Xamarin.Macで表示デバイスの情報を取得する

Xamarin.Macで表示デバイスの情報を取得します。

ソースコード

void Button_Activated(object sender, EventArgs e)
{
    List<string> lines = new List<string>();
    // 画面のデバイス情報を取得する
    NSDictionary description = NSScreen.MainScreen.DeviceDescription;

    // デバイスの解像度
    var displayPixelSize = (description.ObjectForKey(new NSString("NSDeviceSize")) as NSValue).CGSizeValue;
    lines.Add($"デバイスの解像度 = ({displayPixelSize.Width}, {displayPixelSize.Height})");

    // 1インチあたりのドット数(dpi)
    var deviceResolution = (description.ObjectForKey(new NSString("NSDeviceResolution")) as NSValue).CGSizeValue;
    lines.Add($"1インチあたりのドット数(dpi) = ({deviceResolution.Width}, {deviceResolution.Height})");

    // デバイスの色空間名
    var deviceColorSpaceName = (description.ObjectForKey(new NSString("NSDeviceColorSpaceName")));
    lines.Add($"デバイスの色空間名 = {deviceColorSpaceName}");

    // デバイスの色深度
    var deviceBitsPerSample = (description.ObjectForKey(new NSString("NSDeviceBitsPerSample")) as NSNumber).Int32Value;
    lines.Add($"デバイスの色深度 = {deviceBitsPerSample}");

    // ディスプレイの幅と高さ(ミリメートル)
    var screenNumber = (description.ObjectForKey(new NSString("NSScreenNumber")) as NSNumber).UInt32Value;
    var displayPhysicalSize = CGDisplay.ScreenSize(screenNumber);
    lines.Add($"ディスプレイの幅と高さ(ミリメートル) = ({displayPhysicalSize.Width}, {displayPhysicalSize.Height})");

    // DPI
    var dpi = (displayPixelSize.Width / displayPhysicalSize.Width) * 25.4f;
    lines.Add($"DPI = {dpi}");

    TextField.StringValue = string.Join("\n", lines);
}