欢迎各位兄弟 发布技术文章
这里的技术是共享的
powershell ●-ErrorAction - Continue - SilentlyContinue - Inquire 示例
下面是一个示例,展示了如何在 PowerShell 脚本中使用 -ErrorAction 参数的不同值(Continue、SilentlyContinue 和 Inquire)来处理错误。这些参数可以帮助你在脚本执行过程中更好地控制错误行为。
假设你有一个脚本,用于创建一个目录,并在不同情况下处理错误。我们将展示如何使用 -ErrorAction 参数的不同值。
powershell深色版本[CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$DirectoryPath#在[CmdletBinding()] 已经内置了 这个参数,不能再重新定义了,否则会报 对命令多次定义了名为“ErrorAction”的参数。的错 #[Parameter()] #[ValidateSet('Continue', 'SilentlyContinue', 'Inquire')] #[string]$ErrorAction = 'Continue' ) $ErrorAction = $PSBoundParameters['ErrorAction'] # 用于输出详细信息 Write-Verbose "开始创建目录: $DirectoryPath" # 用于输出调试信息 Write-Debug "调试信息: 检查目录是否已存在" # 检查目录是否已经存在 if (Test-Path -Path $DirectoryPath) { Write-Verbose "目录已存在: $DirectoryPath" } else { try { # 使用 -ErrorAction 参数处理错误 New-Item -Path $DirectoryPath -ItemType Directory -ErrorAction $ErrorAction Write-Verbose "目录已创建: $DirectoryPath" } catch { Write-Error "创建目录时发生错误: $_" switch ($ErrorAction) { 'Continue' { Write-Warning "继续执行后续操作" } 'SilentlyContinue' { Write-Host "忽略错误并继续" } 'Inquire' { $response = Read-Host "创建目录时发生错误,是否继续?(Y/N)" if ($response -eq 'Y') { Write-Host "继续执行后续操作" } else { Write-Host "操作已取消" exit } } } } }
[CmdletBinding()]:
启用了脚本的高级功能,包括支持 -Verbose、-Debug 和 -ErrorAction 参数。
param ([Parameter(Mandatory = DirectoryPath, [Parameter()][ValidateSet('Continue', 'SilentlyContinue', 'Inquire')][string]$ErrorAction = 'Continue'):
DirectoryPath:必需的参数,表示要创建的目录路径。
ErrorAction:可选的参数,默认值为 Continue,使用 ValidateSet 确保传入的值只能是 Continue、SilentlyContinue 或 Inquire。
定义了两个参数:
Write-Verbose "开始创建目录: $DirectoryPath":
使用 Write-Verbose 输出详细信息。只有当用户在调用脚本时指定了 -Verbose 参数时,这些信息才会显示。
Write-Debug "调试信息: 检查目录是否已存在":
使用 Write-Debug 输出调试信息。只有当用户在调用脚本时指定了 -Debug 参数时,这些信息才会显示。
Test-Path -Path $DirectoryPath:
检查目录是否已经存在。
New-Item -Path ErrorAction:
尝试创建目录,并使用 -ErrorAction 参数指定错误处理行为。
Write-Error "创建目录时发生错误: $_":
捕获并输出错误信息。
switch ($ErrorAction):
Continue:继续执行后续操作。
SilentlyContinue:忽略错误并继续。
Inquire:询问用户是否继续。
根据用户指定的 -ErrorAction 参数值,采取不同的错误处理策略:
保存上述脚本到一个文件,例如 CreateDirectory.ps1,然后可以在 PowerShell 中调用它:
Continue 处理错误powershell深色版本.\CreateDirectory.ps1 -DirectoryPath "C:\Path\To\NewFolder" -ErrorAction Continue
SilentlyContinue 处理错误powershell深色版本.\CreateDirectory.ps1 -DirectoryPath "C:\Path\To\NewFolder" -ErrorAction SilentlyContinue
Inquire 处理错误powershell深色版本.\CreateDirectory.ps1 -DirectoryPath "C:\Path\To\NewFolder" -ErrorAction Inquire
通过这些参数,你可以更好地控制脚本的错误处理行为,提高脚本的健壮性和用户体验。
Read-Host 是什么意思
Read-Host 是 PowerShell 中的一个 cmdlet,用于从用户那里读取输入。它通常用于在脚本或命令行中提示用户输入某些信息,并将该输入存储在一个变量中,以便后续使用。
powershell深色版本Read-Host [-Prompt <String>] [<CommonParameters>]
-Prompt <String>:
用于指定提示信息,显示给用户,告诉他们需要输入什么内容。
这个参数是可选的,但通常会使用它来提供清晰的提示。
powershell深色版本$UserName = Read-Host "请输入您的用户名" Write-Host "您输入的用户名是: $UserName"
在这个示例中,Read-Host 会显示提示信息 "请输入您的用户名",用户输入的内容会被存储在变量 $UserName 中,然后通过 Write-Host 输出用户输入的用户名。
Read-Host 还可以用于读取密码,这时可以使用 -AsSecureString 参数来隐藏输入内容,防止密码在屏幕上显示。
powershell深色版本$Password = Read-Host "请输入您的密码" -AsSecureString
在这个示例中,用户输入的密码不会显示在屏幕上,而是以安全字符串的形式存储在变量 $Password 中。
假设你有一个脚本,需要用户输入用户名和密码,然后进行某些操作。你可以这样编写脚本:
powershell深色版本# 提示用户输入用户名
$UserName = Read-Host "请输入您的用户名"
# 提示用户输入密码,并以安全字符串形式存储
$Password = Read-Host "请输入您的密码" -AsSecureString
# 将安全字符串转换为明文(仅用于示例,实际应用中应谨慎处理密码)
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($Password)
$PlainTextPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
# 输出用户输入的信息
Write-Host "您输入的用户名是: $UserName"
Write-Host "您输入的密码是: $PlainTextPassword"
安全性:
当处理敏感信息(如密码)时,建议使用 -AsSecureString 参数来保护输入内容。
转换安全字符串为明文时应谨慎处理,避免将密码泄露到日志或其他不安全的地方。
用户交互:
Read-Host 是一种阻塞操作,即脚本会在等待用户输入时暂停执行,直到用户提供了输入。
通过 Read-Host,你可以使你的 PowerShell 脚本更加互动和灵活,能够根据用户的输入动态调整行为。
Write-Warning 与 Write-Host 区别 见 /node-admin/21694
对命令多次定义了名为“ErrorAction”的参数。 所在位置 行:1 字符: 3 + . 'C:\Users\11111111\Desktop\pw\create_direc.ps1' + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], MetadataException + FullyQualifiedErrorId : ParameterNameAlreadyExistsForCommand
您遇到的错误是因为在脚本中定义了一个与 PowerShell 内置参数同名的参数 ErrorAction。PowerShell 脚本中的高级函数(使用 [CmdletBinding()] 定义的函数)已经包含了一些常用的参数,比如 -ErrorAction,这些参数是为用户提供更丰富的错误处理选项。当您试图重新定义这些参数时,就会出现“对命令多次定义了名为‘ErrorAction’的参数”的错误。
要解决这个问题,您可以移除自定义的 ErrorAction 参数定义,因为 [CmdletBinding()] 已经提供了这个功能。如果您需要设置默认的错误处理行为,可以在 [CmdletBinding()] 后面指定 SupportsShouldProcess 或直接设置默认的 -ErrorAction 值,如下所示:
powershell深色版本[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$DirectoryPath
)
# 设置默认的错误处理行为
$PSDefaultParameterValues = @{
'*:ErrorAction' = 'Continue'
}
# 用于输出详细信息
Write-Verbose "开始创建目录: $DirectoryPath"
# 用于输出调试信息
Write-Debug "调试信息: 检查目录是否已存在"
# 创建目录
if (-not (Test-Path -Path $DirectoryPath)) {
New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Stop
Write-Output "目录创建成功: $DirectoryPath"
} else {
Write-Output "目录已存在: $DirectoryPath"
}
在这个修改后的脚本中,我们没有再定义 ErrorAction 参数,而是通过 $PSDefaultParameterValues 设置了所有命令的默认 -ErrorAction 行为。此外,我还添加了一段逻辑来检查目录是否已经存在,如果不存在则尝试创建它,并根据结果输出相应的消息。这样可以确保脚本在执行过程中能够提供有用的反馈。
这里 New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Stop 的 stop 什么意思
在 PowerShell 中,-ErrorAction 参数用于控制当发生错误时命令的行为。Stop 是 -ErrorAction 参数的一个可能值,它指示当命令遇到错误时应立即停止执行,并将错误作为异常抛出。
具体来说,在命令 New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Stop 中:
如果目录创建成功,命令会正常完成。
如果创建目录时发生错误(例如,路径无效或权限不足),命令会立即停止执行,并抛出一个异常。这会导致脚本的执行中断,除非你在脚本中捕获并处理了该异常。
使用 -ErrorAction Stop 可以帮助你在脚本中更容易地检测和处理错误,尤其是在你需要确保某个操作必须成功才能继续执行后续步骤的情况下。例如,如果你的脚本依赖于新创建的目录来存储文件,那么使用 -ErrorAction Stop 可以确保在目录创建失败时脚本不会继续执行,从而避免后续可能出现的问题。
以下是一个示例,展示了如何结合 try...catch 结构来处理可能发生的错误:
powershell深色版本[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$DirectoryPath
)
# 设置默认的错误处理行为
$PSDefaultParameterValues = @{
'*:ErrorAction' = 'Continue'
}
# 用于输出详细信息
Write-Verbose "开始创建目录: $DirectoryPath"
# 用于输出调试信息
Write-Debug "调试信息: 检查目录是否已存在"
try {
# 创建目录
if (-not (Test-Path -Path $DirectoryPath)) {
New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Stop
Write-Output "目录创建成功: $DirectoryPath"
} else {
Write-Output "目录已存在: $DirectoryPath"
}
} catch {
Write-Error "创建目录时发生错误: $_"
# 这里可以添加更多的错误处理逻辑
}
在这个示例中,如果 New-Item 命令由于任何原因失败,catch 块会被触发,并输出错误信息。这样可以更好地控制脚本的执行流程,并提供更详细的错误报告。
不是说 只有三个值 Continue SilentlyContinue 和 Inquire 吗
您提到的 Continue, SilentlyContinue, 和 Inquire 确实是 -ErrorAction 参数的常见值,但 Stop 也是一个有效的值。实际上,-ErrorAction 参数支持多个值,每个值都有不同的行为:
Continue: 当发生非终止错误时,显示错误消息并继续执行脚本。
SilentlyContinue: 当发生非终止错误时,不显示错误消息并继续执行脚本。
Inquire: 当发生非终止错误时,提示用户是否继续。
Stop: 当发生非终止错误时,停止执行当前命令并抛出一个终止错误。这通常用于 try...catch 块中,以便捕获和处理错误。
这些值都可以用于控制 PowerShell 脚本在遇到错误时的行为。下面是这些值的简要说明:
powershell深色版本New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Continue
如果创建目录失败,会显示错误消息,但脚本会继续执行。
powershell深色版本New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction SilentlyContinue
如果创建目录失败,不会显示错误消息,脚本会继续执行。
powershell深色版本New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Inquire
如果创建目录失败,会提示用户是否继续执行。
powershell深色版本New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Stop
如果创建目录失败,会抛出一个终止错误,停止当前命令的执行。通常用于 try...catch 块中。
以下是一个完整的示例,展示了如何使用 Stop 值来处理错误:
powershell深色版本[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$DirectoryPath
)
# 用于输出详细信息
Write-Verbose "开始创建目录: $DirectoryPath"
# 用于输出调试信息
Write-Debug "调试信息: 检查目录是否已存在"
try {
# 创建目录
if (-not (Test-Path -Path $DirectoryPath)) {
New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction Stop
Write-Output "目录创建成功: $DirectoryPath"
} else {
Write-Output "目录已存在: $DirectoryPath"
}
} catch {
Write-Error "创建目录时发生错误: $_"
# 这里可以添加更多的错误处理逻辑
}
在这个示例中,如果 New-Item 命令因任何原因失败,catch 块会被触发,并输出错误信息。这样可以更好地控制脚本的执行流程,并提供更详细的错误报告。
$PSBoundParameters 自动变量来访问传递给脚本的所有参数。
在 PowerShell 中,-ErrorAction 参数是一个预定义的参数,由 [CmdletBinding()] 提供。当你在调用脚本时传递 -ErrorAction Continue,这个参数值会被传递给脚本中的各个 cmdlet,但不会自动赋值给一个名为 $ErrorAction 的变量。
如果你想在脚本中访问 -ErrorAction 参数的值,你需要显式地声明这个参数。但是,由于 -ErrorAction 是一个预定义的参数,你不能直接在 param 块中重新定义它。你可以通过 $PSBoundParameters 自动变量来访问传递给脚本的所有参数。
以下是修改后的脚本,展示如何访问 -ErrorAction 参数的值:
powershell深色版本[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$DirectoryPath
)
# 获取 -ErrorAction 参数的值
$ErrorActionValue = $PSBoundParameters['ErrorAction']
# 输出 -ErrorAction 参数的值
Write-Host "ErrorAction: $ErrorActionValue"
# 用于输出详细信息
Write-Verbose "开始创建目录: $DirectoryPath"
# 用于输出调试信息
Write-Debug "调试信息: 检查目录是否已存在"
# 创建目录
if (-not (Test-Path -Path $DirectoryPath)) {
New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction $ErrorActionValue
Write-Output "目录创建成功: $DirectoryPath"
} else {
Write-Output "目录已存在: $DirectoryPath"
}
在这个脚本中:
使用 $PSBoundParameters['ErrorAction'] 获取传递给脚本的 -ErrorAction 参数的值。
将获取到的值赋给 $ErrorActionValue 变量。
使用 Write-Host 输出 -ErrorAction 参数的值。
在 New-Item 命令中使用 $ErrorActionValue 作为 -ErrorAction 参数的值。
这样,当你运行脚本并传递 -ErrorAction Continue 时,脚本会正确地输出 ErrorAction: Continue。
powershell深色版本.\aa.ps1 -DirectoryPath "C:\Temp\NewDir" -ErrorAction Continue
输出将会是:
深色版本ErrorAction: Continue
这样你就可以在脚本中访问并使用 -ErrorAction 参数的值了。
$PSBoundParameters 翻译成中文 啥意思
$PSBoundParameters 是 PowerShell 中的一个自动变量,用于存储传递给当前函数、脚本或脚本块的参数及其值。这个变量是一个字典(哈希表),其中键是参数名称,值是对应的参数值。
$PSBoundParameters 可以翻译成中文为“已绑定的参数”或“传递的参数”。
已绑定的参数:指的是那些已经被传递并绑定到当前函数或脚本中的参数。
传递的参数:指的是在调用函数或脚本时传递的参数及其值。
假设你有一个脚本 aa.ps1,内容如下:
powershell深色版本[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$DirectoryPath
)
# 获取 -ErrorAction 参数的值
$ErrorActionValue = $PSBoundParameters['ErrorAction']
# 输出 -ErrorAction 参数的值
Write-Host "ErrorAction: $ErrorActionValue"
# 用于输出详细信息
Write-Verbose "开始创建目录: $DirectoryPath"
# 用于输出调试信息
Write-Debug "调试信息: 检查目录是否已存在"
# 创建目录
if (-not (Test-Path -Path $DirectoryPath)) {
New-Item -ItemType Directory -Path $DirectoryPath -ErrorAction $ErrorActionValue
Write-Output "目录创建成功: $DirectoryPath"
} else {
Write-Output "目录已存在: $DirectoryPath"
}
在这个脚本中,$PSBoundParameters['ErrorAction'] 用于获取传递给脚本的 -ErrorAction 参数的值。
powershell深色版本.\aa.ps1 -DirectoryPath "C:\Temp\NewDir" -ErrorAction Continue
输出将会是:
深色版本ErrorAction: Continue
$PSBoundParameters 还可以用于其他场景,例如:
动态参数处理:根据传递的参数动态生成或修改命令。
日志记录:记录传递给函数或脚本的所有参数及其值,方便调试和审计。
参数验证:在脚本或函数内部验证传递的参数是否符合预期。
希望这个解释对你有帮助!如果你有更多问题,请随时提问。