2014-09-13 25 views
1

我想要一個接受可能只讀文件的複製例程,但複製的目標文件總是不是隻讀的。麻煩在於知道寫入文件的路徑,以便將其更改爲不可讀取。我不會意外地碰到一個沒有被這個複製例程移動的文件,所以我不能只從目標路徑下的所有東西中只讀取一個文件。我是否真的自己重建每個寫入的文件路徑,以便我可以調用set-itemproperty?Powershell:從每個寫入文件中剝離ReadOnly時複製文件

是否有任何干淨的方式來實現像Copy-Item-StripReadOnly「F:\ *」「G:\」這樣的函數,這樣沒有任何寫入G的東西只出現在readonly中,而其餘的G:\是沒有感動?

回答

7

只需使用-PassThru參數複製項目,將每個目標文件傳遞到管道,然後遍歷每個剝只讀:

Copy-Item "F:\*" "G:\" -PassThru | Set-ItemProperty -name isreadonly -Value $false 
+0

什麼版本的powershell是'isreadonly'啓用的?我只是假定我必須按照我回答的方式去做。 – Matt 2014-09-13 01:19:09

+0

太棒了! -PassThru是我正在尋找的關鍵概念。它比我要做的要乾淨得多。我只是試過這個,它按預期工作,謝謝。 – VoidStar 2014-09-13 01:20:32

+0

@Matt我認爲這是永恆的。但我可能會誤解。 – zdan 2014-09-13 01:27:46

0

你需要的作品是檢查它複製的文件是隻讀的,並刪除相當簡單的文件屬性。

$attribute = [io.FileAttribute]::ReadOnly 
If((Get-ItemProperty -Path $file.fullname).attributes -band $attribute) 
{ 
    Set-ItemProperty -Path $file.fullname -Name attributes -Value ((Get-ItemProperty $file.fullname).attributes -bxor $attribute) 
} 

這將檢查文件$file是否爲只讀。如果它刪除只讀位。將其插入管道語句或複製循環中。

我知道這不是一個完整的解決方案,因爲您的問題,但它不容易閱讀作爲評論。此外,你並沒有真正展示研究的任何努力。如果您向我們展示您目前爲止的功能,請將其包含在代碼中。

+0

這是比較容易的部分。馬虎的部分正在獲取每個寫入文件的文件路徑。我知道如何去做,我覺得應該可以在1-2輪內線。但是,再次,也許不是,我考慮得越多,我越失去希望它可以乾淨地完成。 – VoidStar 2014-09-13 01:15:43

+0

zdan的答案比這更好,但是在我的辯護中,我試圖告訴你把它放在一個foreach循環中,以便在複製後檢查每個文件。 – Matt 2014-09-13 01:23:45

+0

是的,它是一個合理的解決方案,但我被掛在了我如何獲得書面文件的集合進行foreach。如果我可以幫忙的話,我不想用一堆Join-Paths來建立一個列表。我覺得像-PassThru這樣的東西必須存在,但我不知道如何更清楚地形成問題。 – VoidStar 2014-09-13 01:34:33