3

私はパワーシェル初心者です。サンプル スクリプトを使用して、1 行目の get-item を get-content に置き換えました。変更されたスクリプトは次のようになります。

$file = get-content "c:\temp\test.txt"
if ($file.IsReadOnly -eq $true)
{
$file.IsReadOnly = $false
}

したがって、本質的に、UNCパスとして保存されているtest.txtに含まれるアクションアイテムを実行しようとしています

\\testserver\testshare\doc1.doc
\\testserver2\testshare2\doc2.doc

スクリプトを実行してもエラーは報告されず、最初のエントリでもアクションは実行されません。

4

2 に答える 2

8

簡潔な答え:

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

于 2009-10-04T13:38:12.297 に答える
2

Johannes は、あなたが直面している問題の背後にある理論についてスクープを持っています。たまたまPowerShell Community Extensionsを使用している場合は、パイプライン対応の Set-Writable および Set-ReadOnly コマンドを使用してこれを実行できることを指摘したかっただけです。

Get-Content "c:\temp\test.txt" | Set-Writable

または短いエイリアス形式:

gc "c:\temp\test.txt" | swr

Set-ReadOnly のエイリアスは sro です。これらのコマンドは、毎日ではないにしても毎週使用します。

于 2009-10-04T18:41:50.190 に答える