簡潔な答え:
sp (gc test.txt) IsReadOnly $false
以下の長い答え
さて、これにはいくつか問題があります。
$file実際にはstring[]、ファイルの行を含む です。そのため、IsReadOnlyプロパティは、たまたまファイル名である文字列で表される実際のファイルではなく、 に適用されます。string[]
したがって、私があなたを正しく理解していれば、他のファイル名を含むファイルを各行に 1 つずつ読み取ろうとしています。そして、それらのファイルの読み取り専用属性をクリアします。
ここで始めることGet-Contentは間違っていません。私たちは間違いなくそれを必要とするでしょう:
$filenames = Get-Content test.txt
これで、ファイル名のリストができました。FileInfoファイルの属性にアクセスするには、それらのファイル名を実際のオブジェクトに変換して操作する必要があります。または、ファイル名を の-Path引数に渡しますSet-ItemProperty。
最初に最初のアプローチを取り、次に別のアプローチに進みます。したがって、多数のファイル名がありFileInfo、それらのオブジェクトが必要です。これはforeachループで実行できます (リスト内のすべてのファイルに対してこれを実行する必要があるため)。
$files = (foreach ($name in $filenames) { Get-Item $name })
次に、ファイル名をループして、IsReadOnlyそれぞれにプロパティを設定できます。
foreach ($file in $files) {
$file.IsReadOnly = $false
}
これは、長くて面倒なバリアントでした。ただし、PowerShell の経験がない人に最も適していると思われます。パイプラインを使用することで、複数のコレクションを配置する必要性を減らすことができます。パイプラインはオブジェクトをあるコマンドレットから別のコマンドレットに転送しますが、それらのオブジェクトにはまだ型があります。
だから書くことで
Get-Content test.txt | Get-Item | ForEach-Object { $_.IsReadOnly = $false }
まったく同じ結果を達成しています。ファイルの内容を読み取り、たくさんのstrings を取得します。Get-Itemこれらは、たまたまパイプライン入力をどう処理するかを知っている に渡されます。これらのオブジェクトはファイル パスとして扱われます。まさに私たちがここで必要としているものです。Get-Item次に、パイプラインのさらに下にオブジェクトを送信FileInfoします。この時点で、オブジェクトをループし、読み取り専用プロパティを に設定しますfalse。
さて、それはより短くなりました。少し練習すれば、さらに簡単になるかもしれません。しかし、理想にはまだほど遠い。前に述べたようにSet-ItemProperty、ファイルに読み取り専用プロパティを設定するために使用できます。Set-ItemPropertyまた、パラメータの入力として文字列の配列を受け取ることができるという事実を利用でき-Pathます。
$files = Get-Content test.txt
Set-ItemProperty -Path $files -Name IsReadOnly -Value $false
Set-ItemProperty入力文字列を直接の値として受け入れないため、ここでは一時変数を使用しています-Path。しかし、この一時変数をインライン化することができます:
Set-ItemProperty -Path (Get-Content test.txt) -Name IsReadOnly -Value $false
呼び出しを囲むかっこは、Get-Contentこれが単一の引数であり、最初に評価する必要があることを PowerShell に伝えるために必要です。
次に、これらの各パラメーターが期待される位置で使用されるという事実を利用Set-ItemPropertyできるため、パラメーター名を省略して値のみに固執できます。
Set-ItemProperty (Get-Content test.txt) IsReadOnly $false
次に、コマンドレット名をデフォルトのエイリアスに短縮できます。
sp (gc test.txt) IsReadOnly $false
はブール値として使用されると に変換されるため、実際にはさらにスペースを節約するために$falseasと書くことができます。でも、ここは短縮で十分だと思います。00$false