2009-10-04 31 views
3

我是powershell新手。我使用了一個示例腳本,並從get-item中取代第一行中的內容。 修改後的劇本看起來象下面這樣:如何更改文件列表的讀屬性?

$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 

當運行腳本沒有報告錯誤,也沒有任何動作即使在第一次輸入時也會執行。

回答

8

簡短的回答:

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 

我們實際上可以寫$false0,以節省更多的空間,因爲0轉換爲$false作爲布爾值使用時。但我認爲在這裏縮短就夠了。

2

約翰內斯掌握了你所遇到的問題背後的理論。我只是想指出,如果你碰巧使用PowerShell Community Extensions您可以通過使用Set-可寫和Set-只讀命令是管道意識到如執行此:

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

或短,別名形式:

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

Set-ReadOnly的別名是sro。我每週使用這些命令,如果不是每天。

+0

啊,很好。看起來我應該深入研究PSCX。確實,我只有他們安裝在Out-Clipboard工作。 – Joey