如何更改文件列表的读取属性?

时间:2009-10-04 12:19:03

标签: file powershell file-attributes

我是powershell新手。我使用了一个示例脚本,并在第一行中使用get-item替换get-content。 修改后的脚本如下所示:

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

所以本质上我试图将test.txt中包含的项目存储为UNC路径

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

运行脚本时,不会报告任何错误,即使首次输入也不会执行任何操作。

2 个答案:

答案 0 :(得分:8)

简短回答:

sp (gc test.txt) IsReadOnly $false

下面的长答案


嗯,有些事情是错的。

$file实际上是string[],包含文件的行。因此,IsReadOnly属性适用于 string[] ,而不适用于这些字符串所代表的实际文件,这些文件名恰好是文件名。

所以,如果我正确地理解你,你正试图读取一个包含其他文件名的文件,每行一个。并清除这些文件的只读属性。

Get-Content开始并没有错。我们肯定会需要它:

$filenames = Get-Content test.txt

现在我们有一个文件名列表。要访问文件的属性,我们需要将这些文件名转换为实际的FileInfo对象并对其进行操作。或者我们将文件名传递给-Path的{​​{1}}参数。

我将先采用第一种方法然后转到另一种方法。所以我们有一堆文件名,并且需要Set-ItemProperty个对象。这可以通过FileInfo循环完成(因为我们需要对列表中的每个文件执行此操作):

foreach

然后,您可以遍历文件名并在每个文件名上设置$files = (foreach ($name in $filenames) { Get-Item $name }) 属性:

IsReadOnly

这是漫长而繁琐的变种。但是,对于PowerShell来说,没有任何经验的人可能最适合人。通过使用管道,您可以减少对多个事物集合的需求。管道将对象从一个cmdlet传输到另一个cmdlet,这些对象仍然具有类型。

所以写一下

foreach ($file in $files) {
    $file.IsReadOnly = $false
}

我们取得了完全相同的结果。我们读了一下这个文件的内容,得到了一堆Get-Content test.txt | Get-Item | ForEach-Object { $_.IsReadOnly = $false } 个。这些传递给string,它恰好知道如何处理管道输入:它将这些对象视为文件路径;正是我们需要的。 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 调用的括号来告诉PowerShell这是一个参数,应该先进行评估。

然后,我们可以利用这些参数中的每一个都在Get-Content期望的位置使用这一事实,因此我们可以省略参数名称并仅保留值:

Set-ItemProperty

然后我们可以将cmdlet名称缩短为默认别名:

Set-ItemProperty (Get-Content test.txt) IsReadOnly $false

我们实际上可以将sp (gc test.txt) IsReadOnly $false 写为$false以节省更多空间,因为0在用作布尔值时会转换为0。但我觉得这里的缩短就足够了。

答案 1 :(得分:2)

约翰内斯对你遇到的问题背后的理论有所了解。我只是想指出,如果你碰巧使用PowerShell Community Extensions,你可以通过使用管道感知的Set-Writable和Set-ReadOnly命令来执行此操作,例如:

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

或简短的别名形式:

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

Set-ReadOnly的别名是sro。如果不是每天,我每周使用这些命令。