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

ds5*_*555 3 powershell file file-attributes

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

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

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

\\testserver\testshare\doc1.doc
\\testserver2\testshare2\doc2.doc
Run Code Online (Sandbox Code Playgroud)

运行脚本时,不会报告错误,即使在第一次输入时也不会执行任何操作.

Joe*_*oey 8

简短回答:

sp (gc test.txt) IsReadOnly $false
Run Code Online (Sandbox Code Playgroud)

下面的答案很长


好吧,有些事情是错的.

$file实际上是一个string[],包含文件的行.所以IsReadOnly属性适用string[],而不是被那些字符串,这恰好是文件名所代表的实际文件.

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

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

$filenames = Get-Content test.txt
Run Code Online (Sandbox Code Playgroud)

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

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

$files = (foreach ($name in $filenames) { Get-Item $name })
Run Code Online (Sandbox Code Playgroud)

然后,您可以遍历文件名并IsReadOnly在每个文件名上设置属性:

foreach ($file in $files) {
    $file.IsReadOnly = $false
}
Run Code Online (Sandbox Code Playgroud)

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

所以通过写作

Get-Content test.txt | Get-Item | ForEach-Object { $_.IsReadOnly = $false }
Run Code Online (Sandbox Code Playgroud)

我们取得了完全相同的结果.我们读了一下这个文件的内容,得到了一堆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
Run Code Online (Sandbox Code Playgroud)

我们在这里使用临时变量,因为Set-ItemProperty不会-Path直接接受传入的字符串作为值.但我们可以内联这个临时变量:

Set-ItemProperty -Path (Get-Content test.txt) -Name IsReadOnly -Value $false
Run Code Online (Sandbox Code Playgroud)

Get-Content调用周围的括号需要告诉PowerShell这是一个参数,应该首先进行评估.

然后我们可以利用这些参数中的每一个都在Set-ItemProperty预期位置使用的事实,因此我们可以省略参数名称并仅仅遵循以下值:

Set-ItemProperty (Get-Content test.txt) IsReadOnly $false
Run Code Online (Sandbox Code Playgroud)

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

sp (gc test.txt) IsReadOnly $false
Run Code Online (Sandbox Code Playgroud)

我们实际上可以写$false0节省更多的空间,因为0被转换成$false一个布尔值时.但我觉得这里的缩短就足够了.