IsNullOrEmpty在PowerShell中是否有内置函数来检查字符串是空还是空?
到目前为止我找不到它,如果有内置方式,我不想为此编写函数.
请考虑以下代码:
function f {
param (
[AllowNull()]
[string]
$x
)
return $x
}
$r = f -x $null
Run Code Online (Sandbox Code Playgroud)
$null到达[string]::Empty时转换为return. $null是不同的[string]::Empty,我想保留这种区别.我也更喜欢保持$x类型,[string]因为$x只有字符串的含义,接口在别处使用.
$x出来作为$null当它传递$null?$x传递的吗?$null [string]::Emptyf更新1
我想要做的是为其他类型.以下是相同的概念[int]:
function f {
param(
[System.Nullable[int]]$x
)
return $x
}
$r = f -x $null
Run Code Online (Sandbox Code Playgroud)
在那种情况下$r确实如此$null. $x可以是$null或[int],但没有别的.对我来说似乎很奇怪,我必须允许任何物体,所以我可以通过一个 …
在 PowerShell 中,可以定义 C# 代码并执行它。将 $null 传递到以下最简单的函数中表明 not null 被传递到函数中
Add-Type -TypeDefinition @"
public static class foo
{
public static void fooo(string a)
{
if(a!=null)
{
System.Console.WriteLine("Not Null. Is '" + a + "'");
}
}
}
"@ -Language CSharp
Run Code Online (Sandbox Code Playgroud)
按如下方式调用它会导致输出 Not Null。是 ''。这表明 $null 在 C# 中不为空。'IsNullOrEmpty' 或 'IsNullOrWhiteSpace' 之类的方法返回 true,因此 PowerShell 必须隐式地将 $null 转换为字符串。
[foo]::fooo($Null)
Run Code Online (Sandbox Code Playgroud)
除了在 C# 中调用 String.IsNullOrEnpty 之外,是否有更好的解决方法?注意:这与指定的“Add_Type”的 C# 语言无关。我正在使用 PowerShell V5。
我不记得在旧的Windows操作系统中找到一个窗口有任何问题,但是,我使用PowerShell v4.0在Windows 8.1 Update 2操作系统中没有成功.
这是我正在使用的PowerShell v4.0代码(非常简单):
$sig=@'
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(String sClassName, String sAppName);
'@
$fw = Add-Type -Namespace Win32 -Name Funcs -MemberDefinition $sig -PassThru
$wname='Form1' # any existing window name
$fw::FindWindow($null -as [String], $wname) # returns 0, always!
Run Code Online (Sandbox Code Playgroud)
最后一个命令总是返回0.
将DllImport属性更改为
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
Run Code Online (Sandbox Code Playgroud)
什么都不改变; 0以相同的方式返回.
有趣的是注意到C#中的等效代码,返回正确的HWND值.
有谁知道上面的PowerShell v4.0代码有什么问题(以及如何修复)?