2016-09-22 50 views
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

为什么会出现这种错误发生的呢?

+0

没你尝试以管理员身份运行你的脚本? –

+2

我会得到您的$ HasError变量被初始化为true,并在您的Get-ChildItem调用期间进行评估。尝试在-ErrorVariable调用中删除名称前面的“$”。 –

+0

@MartinBrandl我有。有些文件即使是我们的管理员也不能均匀写入,我不知道为什么。但是,它应该只打印“异常设置”IsReadOnly“等”,但有时它也会出现奇怪的错误。 –

回答

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