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)
运行脚本时,不会报告错误,即使在第一次输入时也不会执行任何操作.
简短回答:
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)
我们取得了完全相同的结果.我们读了一下这个文件的内容,得到了一堆string
s.这些传递给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)
我们实际上可以写$false
为0
节省更多的空间,因为0
被转换成$false
一个布尔值时.但我觉得这里的缩短就足够了.