无法覆盖变量false,因为它是只读或常量

时间:2016-09-22 07:43:45

标签: powershell error-handling

这是我的代码,其中包含了相关部分:

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

为什么会出现此错误?

1 个答案:

答案 0 :(得分:2)

正如@DavidBrabant所指出的,参数-ErrorVariable只需要变量的名称,而不是前导$。此外,此变量的目的不是一个布尔指示符,无论是否发生错误(PowerShell已经通过automatic variable $?提供此信息),而是接收实际的错误对象。

来自documentation

-ErrorVariable [+]<variable-name>
     

别名:ev

     

在指定变量和$Error自动变量中存储有关命令的错误消息。有关更多信息,请键入以下命令:

get-help about_Automatic_Variables
     

默认情况下,新的错误消息会覆盖已存储在变量中的错误消息。要将错误消息附加到变量内容,请在变量名称前键入加号(+)。

     

例如,以下命令创建$a变量,然后在其中存储任何错误:

Get-Process -Id 6 -ErrorVariable a
     

以下命令将任何错误消息添加到$a变量:

Get-Process -Id 2 -ErrorVariable +a