簡短的回答:
sp (gc test.txt) IsReadOnly $false
朗回答以下
好,有些事情是不對的。
$file
實際上是一個string[]
,包含您的文件的行。因此IsReadOnly
屬性適用於string[]
而不是由那些字符串表示的實際文件,這些文件名恰好是文件名。
所以,如果我正確理解你,你正試圖讀取一個文件,其中包含其他文件名,每行一個。並清除這些文件的只讀屬性。
從Get-Content
開始在這裏沒有錯。我們絕對需要它:
$filenames = Get-Content test.txt
現在我們有一個文件名列表。要訪問文件屬性,我們需要將這些文件名轉換爲實際的FileInfo
對象並對其進行操作。或者我們將文件名傳遞給參數Set-ItemProperty
的-Path
。
我會先採取第一種方法,然後轉到另一種。所以我們有一堆文件名,並且想要它們的對象FileInfo
。這可以用foreach
迴路來完成(因爲我們需要在列表中的每個文件,這樣做):
$files = (foreach ($name in $filenames) { Get-Item $name })
然後,您可以遍歷文件名,並設置IsReadOnly
財產上的每個人:
foreach ($file in $files) {
$file.IsReadOnly = $false
}
這是長而繁瑣的變體。但是對於沒有PowerShell經驗的人來說,這可能最適合人們。通過使用管道,您可以減少對多個事物的集合的需求。管道將對象從一個cmdlet傳輸到另一個cmdlet,並且這些對象仍具有類型。
所以寫
Get-Content test.txt | Get-Item | ForEach-Object { $_.IsReadOnly = $false }
我們實現完全相同的結果。我們閱讀文件的內容,得到一堆string
s。這些被傳遞給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
直接值。但是,我們可以內聯這個臨時變量:告訴PowerShell的,這是一個參數,應該先進行評估,需要
Set-ItemProperty -Path (Get-Content test.txt) -Name IsReadOnly -Value $false
圍繞Get-Content
調用的括號內。
然後,我們可以採取的每一個這些參數是在Set-ItemProperty
期望它的位置使用的事實上的優勢,這樣我們就可以離開了參數名稱和堅持公正的價值觀:
Set-ItemProperty (Get-Content test.txt) IsReadOnly $false
然後我們就可以縮短cmdlet名稱爲各自的默認別名:
sp (gc test.txt) IsReadOnly $false
我們實際上可以寫$false
爲0
,以節省更多的空間,因爲0
轉換爲$false
作爲布爾值使用時。但我認爲在這裏縮短就夠了。
啊,很好。看起來我應該深入研究PSCX。確實,我只有他們安裝在Out-Clipboard工作。 – Joey