首页 文章

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

提问于
浏览
0

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

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
        }       
    }
}

我在 SetFolderItemsReadOnly 函数中使用 Set-ItemProperty 会出现一些错误,即

异常设置“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 回答

  • 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

相关问题