我是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
运行脚本时,不会报告任何错误,即使首次输入也不会执行任何操作。
答案 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。如果不是每天,我每周使用这些命令。