小编Sco*_*ott的帖子

在PowerShell脚本中,是否可以判断是否正在使用默认参数值?

假设我有一个带有一个参数的简单脚本,它有一个默认值:

param(
    [string] $logOutput = "C:\SomeFolder\File.txt"
)
# Script...
Run Code Online (Sandbox Code Playgroud)

并且假设用户像这样运行脚本:

PS C:\> .\MyScript.ps1 -logOutput "C:\SomeFolder\File.txt"
Run Code Online (Sandbox Code Playgroud)

有没有办法让脚本能够知道用户明确输入了一个值(恰好与默认值相同),而不是让默认值自动决定?

在此示例中,脚本将打印一些输出到给定文件.如果用户指定该文件(即默认情况下自动使用),那么如果脚本无法写入该位置,脚本将不会产生错误,并且将以静默方式继续运行.但是,如果用户确实指定了位置,并且脚本无法写入该位置,那么它应该产生错误并停止,警告用户.我怎么能实现这种逻辑?

powershell

9
推荐指数
1
解决办法
3579
查看次数

在 PowerShell 中,如果环境变量是字符串的一部分,我该如何转换它们(如 $SystemRoot$)?

我正在尝试编写一个脚本,该脚本从一组注册表项中读取文件路径,但这些路径具有 %SystemRoot% 等环境变量。我知道您通常可以使用以下方法查找这些值:

$env:SystemRoot
Run Code Online (Sandbox Code Playgroud)

例如。但是,如果 PS 收到诸如“%SystemRoot%\System32\Winevt\Logs\DebugChannel.etl”之类的字符串,如何将其转换为我需要的完整路径,即“C:\Windows\System32\Winevt\Logs\ DebugChannel.etl”?

我尝试使用正则表达式 -replace 将 %% 格式转换为 $env: 格式:

$_.FileName -replace "%(\w*)%\\", "`$env:`${1}\"
Run Code Online (Sandbox Code Playgroud)

但这只会导致字符串:

$env:SystemRoot\System32\Winevt\Logs\DebugChannel.etl
Run Code Online (Sandbox Code Playgroud)

而且我不确定如何让 PowerShell 实际评估“$env:SystemRoot”部分。无论如何,我认为有一种更明智的方法可以做到这一点!

我用来获取注册表值并产生上述结果的完整代码是

Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Control\WMI\Autologger | Get-ItemProperty -Name "FileName" -ErrorAction SilentlyContinue | foreach { if($_.FileName) { $_.FileName -replace "%(\w*)%\\", "`$env:`${1}\" } }
Run Code Online (Sandbox Code Playgroud)

谢谢。

regex windows registry powershell environment-variables

2
推荐指数
1
解决办法
2898
查看次数