这是我的代码,其中包含了相关部分:
Get-ChildItem -LiteralPath $somepath -Directory | ForEach-Object {
Step $_.FullName
}
function Step {
Param([string]$subfolder)
$folders = Get-ChildItem -LiteralPath $subfolder -Directory -ErrorVariable $HasError -ErrorAction SilentlyContinue
if ($HasError) {
Write-Host $_.FullName "|" $HasError.Message
return
} else {
$hasError, $inactive = FolderInactive $_.FullName
if ($hasError) {
#do nothing
} else {
if ($inactive) {
SetFolderItemsReadOnly $_.FullName
}
}
}
if ($folders) {
$folders | ForEach-Object {
Step $_.FullName
}
}
}
function SetFolderItemsReadOnly {
Param([string]$Path)
$files = Get-ChildItem -LiteralPath $Path -File -ErrorAction Stop
foreach ($file in $files) {
try {
Set-ItemProperty -LiteralPath $file.FullName -Name IsReadOnly -Value $true
} catch {
Write-Host $file.FullName " | " $_.Exception.Message
}
}
}
Set-ItemProperty
函数中的SetFolderItemsReadOnly
出现了一些错误,即
异常设置“IsReadOnly”:“拒绝访问路径。”
这是由于某些安全权限。然而,在终端中打印此错误后,我也会收到一个巨大的红色错误:
Cannot overwrite variable false because it is read-only or constant. At pathtoscript:55 char:5 + $folders = Get-ChildItem -LiteralPath $subfolder -Directory -ErrorVariable ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : WriteError: (false:String) [], SessionStateUnauthorizedAccessException + FullyQualifiedErrorId : VariableNotWritable
为什么会出现此错误?
答案 0 :(得分:2)
正如@DavidBrabant所指出的,参数-ErrorVariable
只需要变量的名称,而不是前导$
。此外,此变量的目的不是一个布尔指示符,无论是否发生错误(PowerShell已经通过automatic variable $?
提供此信息),而是接收实际的错误对象。
-ErrorVariable [+]<variable-name>
别名:
ev
在指定变量和
$Error
自动变量中存储有关命令的错误消息。有关更多信息,请键入以下命令:get-help about_Automatic_Variables
默认情况下,新的错误消息会覆盖已存储在变量中的错误消息。要将错误消息附加到变量内容,请在变量名称前键入加号(+)。
例如,以下命令创建
$a
变量,然后在其中存储任何错误:Get-Process -Id 6 -ErrorVariable a
以下命令将任何错误消息添加到
$a
变量:Get-Process -Id 2 -ErrorVariable +a