xlogI125’s blog

パソコン作業を効率化したい

Get-ChildItem -File の BaseName, Extension をCSV形式でクリップボードにコピー

メモ

  • Rename-Itemに使用する文字列の生成をExcelワークシートで行う場合を想定

使い捨てスクリプト

  • スクリプトの起動方法はショートカット(.lnk)アイコンへのドラッグ&ドロップ
# PowerShell 5.1, Windows 11

# [ファイル名]
#  "%USERPROFILE%\Desktop\MySort.ps1"
# [エンコード]
#  UTF-8 (BOM付き)

# [ショートカット(.lnk)]
#  リンク先(T):
#   PowerShell.exe -NoLogo -NoExit -NoProfile -ExecutionPolicy RemoteSigned -File "%USERPROFILE%\Desktop\MySort.ps1"
#  作業フォルダー(S):
#   ""

Set-StrictMode -Version Latest

$null | Set-Clipboard

try {
  Write-Verbose "`n`$args`[0`]`n$($args[0])" -Verbose
}
catch {
  throw
}

Set-Location -LiteralPath (Split-Path -LiteralPath $args[0])

$a = @(Get-ChildItem -Force -File)

Add-Type -Language CSharp -TypeDefinition @'
using System.Collections.Generic;
using System.Management.Automation;
using System.Runtime.InteropServices;

namespace MyNamespace {
  public class MyClass {
    [DllImport(
      "Shlwapi.dll", EntryPoint = "StrCmpLogicalW", CharSet = CharSet.Unicode
    )]
    public static extern int StrCmpLogicalW(
      [MarshalAs(UnmanagedType.LPWStr)] string psz1, 
      [MarshalAs(UnmanagedType.LPWStr)] string psz2
    );

    public static List<T> MySort<T>(T[] objArray) where T : PSObject {
      List<T> objList = new List<T>(objArray);
      objList.Sort((x, y) => {
        string str1 = x.Properties["Name"].Value.ToString();
        string str2 = y.Properties["Name"].Value.ToString();
        return StrCmpLogicalW(str1, str2);
      });
      return objList;
    }
  }
}
'@

$b = [MyNamespace.MyClass]::MySort([PSCustomObject[]]$a)

$c = $b | Select-Object -Property BaseName, Extension

$c | ConvertTo-Csv -NoTypeInformation | Set-Clipboard

Write-Verbose @"
`nクリップボードに再度コピー
`$c | ConvertTo-Csv -NoTypeInformation | Set-Clipboard
"@ -Verbose

Write-Output -InputObject $c

過去記事

dy100ms.hatenadiary.jp