IsNullOrEmpty在PowerShell中是否有内置函数来检查字符串是空还是空?
到目前为止我找不到它,如果有内置方式,我不想为此编写函数.
我发现自己做的越来越多的事情是检查字符串是否为空(如in ""或null)和条件运算符.
一个当前的例子:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Run Code Online (Sandbox Code Playgroud)
这只是一种扩展方法,它相当于:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Run Code Online (Sandbox Code Playgroud)
因为它是空的而不是null,所以??不会这样做.一个string.IsNullOrEmpty()版本??将是完美的解决方案.我认为必须有一个更清洁的方式来做这件事(我希望!),但我一直在找不到它.
有没有人知道更好的方法来做到这一点,即使它只在.Net 4.0中?
简单的问题:
如果我在32位系统上的PowerShell脚本中使用$ {env:ProgramFiles(x86)}变量,它会返回"C:\ Program Files"还是未定义?
在x64系统上,当在x64和x86模式下运行时,它将映射到"C:\ Program Files(x86)".我没有要测试的32位系统,但我希望它将映射到"C:\ Program Files"文件夹,这样我就可以用它来引用任何系统上的x86程序.
在bash中我可以做这样的事情,name如果UserName没有设置,设置为默认值:
name=${UserName:-James}
Run Code Online (Sandbox Code Playgroud)
Powershell是否支持这样的事情?
在Powershell脚本上工作我有几个地方我想要A除非它是null,否则B.本质上是?? C#中的运算符.我最终编写了下面显示的函数,但我不禁想到有一种内置的方法可以做到这一点.
有没有更好的,内置的方式?
function Get-ValueOrDefault()
{
foreach ($value in $args)
{
if ($value -ne $null) { return $value }
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这更好:
function Get-ValueOrDefault() { $args | select -first 1 }
Run Code Online (Sandbox Code Playgroud) 我试图从脚本中删除变量的定义,并从类似于以下内容的 XML 配置文件中读取它们:
XML文件
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<process>FALSE</process>
<xmlDir>\\serv1\dev</xmlDir>
<scanDir>\\serv1\dev</scanDir>
<processedDir>\\serv1\dev\done</processedDir>
<errorDir>\\serv1\dev\err</errorDir>
<log>\\serv1\dev\log\dev-Log##DATE##.log</log>
<retryDelay>5</retryDelay>
<retryLimit>3</retryLimit>
</settings>
Run Code Online (Sandbox Code Playgroud)
然后使用以下内容解析脚本中的 XML:
[xml]$configFile = Get-Content $PSScriptRoot\$confFile
$settings = $configFile.settings.ChildNodes
foreach ($setting in $settings) {
New-Variable -Name $setting.LocalName -Value ($setting.InnerText -replace '##DATE##',(get-date -f yyyy-MM-dd)) -Force
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但问题是它们都作为字符串读取,但有些我需要作为整数读取。为了解决这个问题,我必须在创建变量后将它们更改为整数,如下所示:
$retryDelay = ([int]$retryDelay)
$retryLimit = ([int]$retryLimit)
Run Code Online (Sandbox Code Playgroud)
虽然这可行,但我希望在 XML 中包含其他变量,例如布尔值 $true / $false (并作为布尔值读入),并且宁愿让 foreach 能够处理它们的类型,而不是脚本中的其他行。任何线索表示赞赏。
好的,最近我正在寻找一种在 PowerShell 中空合并的方法,我遇到了这篇文章:在 powershell 中空合并。
我看到@Zenexer 的评论,很感兴趣。这是语法:
Clear-Host
#expected one
"Test 1: " + ("one", "two", 1 -ne $null)[0]
#expected two
"Test 2: " + ($null, "two", 1 -ne $null)[0]
Run Code Online (Sandbox Code Playgroud)
这完美地工作。然而,我和一位同事 (Walter Puckett) 非常感兴趣,并且对语法进行了更多的挖掘,发现了一些真正的奇怪之处。
在我陷入奇怪之前,谁能指出任何解释这种语法的文档?
## THE WEIRDNESS:
# it does not matter what the number is evidently
"Test 3: " + ($null, "two", 8675309 -ne $null)[0]
# reversing the comparison test breaks the coalesce
"Test 4: " + ($null, "two", $null -ne 1)[0]
# Moving the test …Run Code Online (Sandbox Code Playgroud) 我有一个 PowerShell 脚本从 CSV 中提取数据。我想做的是根据值“替换”帐户列中的数据。例如,帐户 001 = 硬件,帐户 002 = 软件等。CSV 中的数据是从 SQL 数据库中提取的,因此如果我可以更轻松地在 SQL 脚本中更改它,我可以轻松做到这一点。CSV 中的帐户列有 001、002 等。我想将这些值更改为硬件、软件等。感谢您的帮助。
$Results = import-csv Expenses.csv
$Array = @()
Foreach($R in $Results)
{
$Object = [pscustomobject][ordered] @{
Account = $R.Account
Vendor = $R.Desc1
Item = $R.Desc2
Amount = $R.Amount
}
$Array += $Object
}
$Array
Run Code Online (Sandbox Code Playgroud)