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

标签 file powershell file-attributes

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

$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

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

最佳答案

简答:

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。这些被传递给 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

Get-Content 调用周围的括号用于告诉 PowerShell 这是一个单独的参数,应首先计算。

然后我们可以利用这些参数中的每一个都在 Set-ItemProperty 期望的位置使用这一事实,因此我们可以省略参数名称并坚持值(value)观:

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

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

sp (gc test.txt) IsReadOnly $false

我们实际上可以将 $false 写成 0 以节省更多空间,因为 0 被转换为 $false 用作 bool 值时。但我认为这里缩短就足够了。

关于file - 如何更改文件列表的读取属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1516273/

相关文章:

powershell - MS Azure PowerShell - 订阅名称不存在

c# - 获取特定文件属性

C#使文件从只读读/写

python - 如何在 Windows 上访问文件的属性?

android - 获取默认的声音目录

file - 使用主机特定文件(如果存在)而不是角色中的文件?

json - Powershell Json 格式化

powershell - powershell 中的新项目错误

c++ - 如何从文本文件中读取和获取整数之和?

c++ - 如何从txt文件C++中读取特定数字