✅
PowerShell でファイルを非表示にする
普通の方法
例えば a.txt に隠し属性を与えるには、次のようにします。
Set-ItemProperty a.txt Attributes Hidden
だけどこれ、忘れるんですよね。しかも補完が利かないから全部打たなきゃいけないし、複数の属性をつけるのも面倒。
動的パラメータを使ったスクリプト
それで、スクリプトを書いてみました。
using namespace System.Collections.ObjectModel
using namespace System.IO
using namespace System.Management.Automation
[CmdletBinding(SupportsShouldProcess = $True, DefaultParameterSetName = 'Path')]
Param (
[SupportsWildCards()]
[Parameter(
Mandatory = $True,
Position = 0,
ParameterSetName = 'Path',
ValueFromPipelineByPropertyName = $True,
ValueFromPipeline = $True
)]
[string[]]$Path,
[Alias("LP")]
[Alias("PSPath")]
[Parameter(
Mandatory = $True,
Position = 0,
ParameterSetName = 'LiteralPath',
ValueFromPipelineByPropertyName = $True
)]
[string[]]$LiteralPath
)
DynamicParam {
$params = New-Object RuntimeDefinedParameterDictionary
function NewDynamicParam([String]$Name, [Type]$ParameterType, [Attribute[]]$Attributes) {
$attributeCollection = New-Object Collection[System.Attribute]
$Attributes | Foreach-Object { $attributeCollection.Add($_) }
$param = New-Object RuntimeDefinedParameter($Name, $ParameterType, $attributeCollection)
$params.Add($Name, $param)
}
NewDynamicParam Attributes ([FileAttributes[]]) @(
(New-Object ParameterAttribute -Property @{
Mandatory = $True;
Position = 1
}),
(New-Object ValidateSetAttribute ([Enum]::GetValues([FileAttributes])))
)
$params
}
Process {
[FileAttributes]$attributes = 0
$PSBoundParameters['Attributes'] | Foreach-Object {
$attributes = $attributes -bor $_
}
if ($PSBoundParameters.ContainsKey('Path')) {
$LiteralPath = Convert-Path $Path
}
$LiteralPath | Foreach-Object {
if ($PSCmdlet.ShouldProcess($_)) {
Set-ItemProperty -LiteralPath $_ -Name Attributes -Value $attributes -Confirm:$False
}
}
}
これを Set-FileAttributes.ps1 として保存し、次のように使います。
Set-FileAttributes a.txt Hidden, Archive
属性はカンマで区切って配列として与えることで複数指定できます。ここでは Hidden 属性と Archive 属性を付与しています。しかも動的パラメーターなので補完が利きます。
Set-FileAttributes a.txt h
とここまで打ってタブキーを押すと Hidden になります。
これで快適。
執筆日: 2019/02/14
Discussion