Windows(PowerShell)用コマンド
DcomのAppID
Get-WmiObject Win32_DCOMApplication
Get-WmiObject Win32_DCOMApplication | Where-Object {$_.AppID -eq "{...}"}
デバイスインスタンスパス
Get-PnpDevice | Where-Object {$_.InstanceId -eq "..."}
Get-WmiObject Win32_PNPEntity
CLSID
Get-WmiObject Win32_ClassicCOMClass
Get-WmiObject Win32_ClassicCOMClass | Where-Object {$_.ComponentId -eq "{...}"}
System復元
DISM /Online /Cleanup-image /Restorehealth
sfc /verifyonly
or
sfc /scannow
Write-Host
-ForegroundColor
-BackgroundColor
-NoNewline
Color
Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
背景色が行全体にならないようにする
Write-Host $new -ForegroundColor $foreground -BackgroundColor $background -NoNewline
Write-Host ([char]0xA0)
-
(Get-ChildItem -LiteralPath "path").Count
: 要素の数 -
(Get-ChildItem -LiteralPath "path").Length
: 要素(ファイル)のサイズ -
Split-Path -LiteralPath "path"
: "-Leaf", "-Parent"などが使えない
ゴミ箱へ送る
function moveToTrash {
param (
[Parameter(Mandatory)] $path,
[Alias("w")][switch] $whatif
)
$path = Get-Item -LiteralPath $path
# printDelete $path.FullName -str "moveToTrash: "
if (-not $whatif) {
$shell = New-Object -ComObject "Shell.Application"
$trash = $shell.NameSpace(10)
$trash.MoveHere($path.FullName)
for ($i = 0; (Test-Path $path.FullName) -and $i -lt 60; ++$i ) {
Start-Sleep -s 1
}
}
}
余談だけど、初めは下記のようにResolve-Path
を使っていて上手くいかなかった
function moveToTrash {
param (
[Parameter(Mandatory)] $path,
[Alias("w")][switch] $whatif
)
$path = Resolve-Path -LiteralPath $path
# printDelete $path -str "moveToTrash: "
if (-not $whatif) {
$shell = New-Object -ComObject "Shell.Application"
$trash = $shell.NameSpace(10)
$trash.MoveHere($path)
for ($i = 0; (Test-Path $path) -and $i -lt 60; ++$i ) {
Start-Sleep -s 1
}
}
}
解決するには以下のように明示的に$path
の文字列を渡してやる必要がある。
function moveToTrash {
param (
[Parameter(Mandatory)] $path,
[Alias("w")][switch] $whatif
)
$path = Resolve-Path -LiteralPath $path
# printDelete $path -str "moveToTrash: "
if (-not $whatif) {
$shell = New-Object -ComObject "Shell.Application"
$trash = $shell.NameSpace(10)
$trash.MoveHere($path.Path) # $path.ToString()
for ($i = 0; (Test-Path $path) -and $i -lt 60; ++$i ) {
Start-Sleep -s 1
}
}
}
このような挙動があるからPowerShellは、苦手。
もっとも型とかしっかりと理解できていないからだとは思うけど。
New-Item
New-Item -Name $path
: ほかのコマンドレットの-Path
に当たる。ワイルドカードを受け付ける。
New-Item $path
: ほかのコマンドレットの-LiteralPath
に当たる。ワイルドカードを受け付けない。
統一してほしい。
出力の抑制
New-Item $path -ItemType Directory | Out-Null
$null = New-Item $path -ItemType Directory
[void](New-Item $path -ItemType Directory)
Oneドライブのディレクトリ移動
- 設定 -> このPCのリンク解除
- ディレクトリ移動
- 再ログイン
- 移動先をリンク
パーティション 削除
DISKPART
LIST DISK
SELECT DISK n
LIST PARTITION
SELECT PARTITION n
-
DELETE PARTITION OVERRIDE
# 保護されたパーティションの場合は、OverRideを付ける
ファイルのアクセス状況を確認する
openfiles
を使用する
下準備
ファイルの情報を取得するためには、システム・グローバル・フラグ(OSの動作状態を決めるためのパラメータの1つ)のmaintain objects list
をオンする必要がある。
下記を実行するとファイルの情報をトレースできるようになる
openfiles /local on
これを実行してPCを再起動する
ただし、システムのパフォーマンスが下がるので必要に応じてOnにする必要がある
実行
openfiles
を引数無しで実行すると一覧が表示される
Get-Item
Get-Item -LiteralPath ".git" #error
Get-ChildItem -LiteralPath ".git" #ok
アクセス権限
$acl = Get-Acl .
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Everyone","FullControl","Allow")
$acl.SetAccessRule($accessRule)
$acl | Set-Acl .
空フォルダを消す
function searchDirectory {
Param(
[Parameter(Mandatory)][string] $path
)
Get-ChildItem -Recurse -Force -ErrorAction SilentlyContinue $path | Where-Object { $_.PSIsContainer }
}
function _deleteEmptyDirectories {
param (
[Parameter(Mandatory)][array] $paths,
[Alias("w")][switch] $whatif
)
foreach ($dir in $dirs) {
if (-not ($dir.PSIsContainer)) {
continue
}
if ( (Get-ChildItem -LiteralPath $dir | Measure-Object).Count -eq 0) {
Write-Host "delete: " $dir
Remove-Item $dir -WhatIf:$whatif
}
}
}
function deleteEmptyDirectories {
param (
[Parameter(Mandatory)][string] $path,
[Alias("w")][switch] $whatif
)
$dirs = searchDirectory $path
[array]::Reverse($dirs)
_deleteEmptyDirectories $dirs -whatif:$whatif
}
$Profile
> code $Profile
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
chcp 65001