PowerShell でファイルを非表示にする

2021/09/02に公開

普通の方法

例えば 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

GitHubで編集を提案

Discussion