Powershell警告和error handling

下面的代码我正在写代替我下面的批处理脚本。

$Script:srcpath = ((Get-Location).Path) $Script:configure = "$Script:srcpath\qtbase\configure.bat" if (Get-Item "$Script:srcpath\qtbase\configure.bat" -WarningAction (Write-Warning "$Script:configure not found. Did you forget to run 'init-repository'?")) { continue } 

我尝试重写qtconfiguration批处理脚本:

 set "srcpath=%~dp0" set "configure=%srcpath%qtbase\configure.bat" if not exist "%configure%" ( echo %configure% not found. Did you forget to run "init-repository"? >&2 exit /b 1 ) if not exist qtbase mkdir qtbase || exit /b 1 echo + cd qtbase cd qtbase || exit /b 1 echo + %configure% -top-level %* call %configure% -top-level %* set err=%errorlevel% cd .. exit /b %err% 

我在PowerShell中遇到的错误如下:

 Get-Item:无法将参数“WarningAction”绑定到目标。 例外设置
 “WarningAction”:“未将对象引用设置为对象的实例”。
在线:4 char:67
 + ... rningAction(写警告“$脚本:configuration未find。你有没有...
 +〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ~~~~~~~~
     + CategoryInfo:WriteError:(:) [Get-Item],ParameterBindingException
     + FullyQualifiedErrorId:ParameterBindingFailed,Microsoft.PowerShell.Commands.GetItemCommand

问题是抛出的错误是错误的,因为警告正在调用是应该取而代之的告诉人们该项目不存在。 所以运行“init-repository”。

PowerShell中不存在“如果不存在”。

好的,有,但看起来像这样:

 catch [System.Management.Automation.ItemNotFoundException] 

我在上class时遇到问题。

为什么我要这样做之前有人问是因为我觉得微软将逐步淘汰一些时间CMD更新脚本是很好的。

为什么它不工作

WarningAction不能像那样工作。

从about_CommonParameters文档 :

确定cmdlet如何响应命令中的警告。 “继续”是默认值。 此参数仅在命令生成警告消息时才起作用。 例如,当一个命令包含Write-Warning cmdlet时,此参数可用。

所以基本上, WarningAction的值默认为Continue ,可以设置为InquireSilentlyContinue或者Stop 。 它设置的值决定了如果 Get-item命令抛出一个警告会采取什么动作,而不是Get-item抛出警告时要写什么警告。

您可以更改首选变量 $WarningPreference以便在当前范围内设置WarningAction ,或者在范围修饰符前面进行设置。


如何让它工作

Test-Path

我第二次理查德的评论使用Test-Path 。 这将返回TrueFalse ,取决于它是否找到该文件。

 if (-not (Test-Path -Path "$Script:srcpath\qtbase\configure.bat")){ Write-Warning 'Does not exist!' # do other stuff continue }else{ Get-Item $configure } 

try / catch

您可以尝试直接在try / catch中捕获由Get-Item引发的异常。 与WarningAction类似, ErrorAction也可以决定如何处理错误。 终止错误是必需的,所以ErrorAction设置为Stop

 try{ Get-Item $configure -ErrorAction Stop }catch [System.Management.Automation.ItemNotFoundException]{ Write-Output "Item not found" # do other stuff }catch{ Write-Output "Some other error" $Error[0] # prints last error }