有关Path变量的if语句-Powershell-正确/错误测试

时间:2018-07-17 19:24:46

标签: powershell boolean conditional

基本上,我想检查目录是否存在,如果没有退出,请运行此部分。

我的脚本是:

$Path = Test-Path  c:\temp\First

if ($Path -eq "False")
{
  Write-Host "notthere" -ForegroundColor Yellow
}
elseif ($Path -eq "true")
{
  Write-Host " what the smokes"
}

但是它什么也不返回。

4 个答案:

答案 0 :(得分:4)

错误来自Test-Path的返回值是布尔类型的事实。

因此,请勿将其与布尔值的字符串表示形式进行比较,而应与实际的$false / $true值进行比较。像这样,

$Path = Test-Path  c:\temp\First

if ($Path -eq $false)
{
    Write-Host "notthere" -ForegroundColor Yellow
}
elseif ($Path -eq $true)
{
    Write-Host " what the smokes"
}

另外,请注意,您可以在此处使用else语句。

或者,您可以使用@ user9569124答案中建议的语法,

$Path = Test-Path  c:\temp\First

if (!$Path)
{
    Write-Host "notthere" -ForegroundColor Yellow
}
elseif ($Path)
{
    Write-Host " what the smokes"
}

答案 1 :(得分:3)

在比较操作中,PowerShell自动将第二个操作数转换为第一个操作数的类型。由于您正在将布尔值与字符串进行比较,因此该字符串将被强制转换为布尔值。空字符串将强制转换为$false,非空字符串将强制转换为$true。 Jeffrey Snover撰写了有关这些自动转换的文章"Boolean Values and Operators",您可以查看其更多详细信息。

因此,此行为具有(看似悖论)的效果,您的每个比较都将评估为变量的值:

PS C:\> $false -eq 'False'
False
PS C:\> $false -eq 'True'
False
PS C:\> $true -eq 'False'
True
PS C:\> $true -eq 'True'
True

从本质上讲,这意味着如果您的Test-Path语句的计算结果为$false 您的条件中的任何一个都不匹配。

正如其他人指出的那样,您可以通过将变量与实际布尔值进行比较来解决此问题,或者仅通过单独使用变量即可解决此问题(因为它已经包含可以直接求值的布尔值)。但是,您需要谨慎使用后一种方法。在这种情况下,它没有什么区别,但是在其他情况下,将不同的值自动转换为相同的布尔值可能不是理想的行为。例如,$null,0,空字符串和空数组都被解释为布尔值$false,但根据代码中的逻辑,它们的语义可能完全不同。

此外,也不需要先将Test-Path的结果存储在变量中。您可以将表达式直接放入条件中。而且由于只有两个可能的值(文件/文件夹存在或不存在),因此不需要进行两次比较,因此您的代码可以简化为以下形式:

if (Test-Path 'C:\temp\First') {
    Write-Host 'what the smokes'
} else {
    Write-Host 'notthere' -ForegroundColor Yellow
}

答案 2 :(得分:2)

如果我没记错的话,可以简单地说:

if($Path) 要么 if(!$Path)

但是我可能不对,因为我无法测试atm。

此外,还有Test-Path cmdlet可用。不幸的是,在不了解情况和情况的情况下,我无法描述这种差异或提出最合适的方法。

[已编辑为澄清答案]

$Path = "C:\"
if($Path)
    {
    write-host "The path or file exists"
    }
else
    {
    write-host "The path or file isn't there silly bear!"
    }

希望更加清晰。使用此方法,不需要cmdlet。返回的布尔值将自动为您解释,如果满足测试条件,则运行代码块(在这种情况下,如果路径C:\存在)。对于较长文件路径C:\...\...\...\...\file.txt

中的文件也是如此

答案 3 :(得分:0)

为了清楚起见,请始终使用 Test-Path(或 Test-Path with Leaf 来检查文件)。

我测试过的示例:

$File = "c:\path\file.exe"
$IsPath = Test-Path -Path $File -PathType Leaf

# using -Not or ! to check if a file doesn't exist
if (-Not(Test-Path -Path $File -PathType Leaf)) {
    Write-Host "1 Not Found!"
}

if (!(Test-Path -Path $File -PathType Leaf)) {
    Write-Host "2 Not Found!"
}

# using -Not or ! to check if a file doesn't exist with the result of Test-Path on a file
If (!$IsPath) {
    Write-Host "3 Not Found!"
}

If (-Not $IsPath) {
    Write-Host "4 Not Found!"
}

# $null checks must be to the left, why not keep same for all?
If ($true -eq $IsPath) {
    Write-Host "1 Found!"
}

# Checking if true shorthand method    
If ($IsPath) {
    Write-Host "2 Found!"
}

if (Test-Path -Path $File -PathType Leaf) {
    Write-Host "3 Found!"
}