真/假测试返回意外结果

问题描述 投票:0回答:4

基本上我想检查目录是否存在,然后运行此部分,如果不存在则退出。

我的脚本是:

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

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

但它什么也没返回。

powershell boolean conditional-statements
4个回答
16
投票

错误来自于

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"
}

5
投票

在比较操作中,PowerShell 自动将第二个操作数转换为第一个操作数的类型。由于您要将布尔值与字符串进行比较,因此该字符串将被转换为布尔值。空字符串将被转换为

$false
,非空字符串将被转换为
$true
。 Jeffrey Snover 写了一篇关于这些自动转换的文章“布尔值和运算符”,您可以查看该文章以了解更多详细信息。

因此,这种行为具有(看似悖论)的效果,即您的每次比较都会评估变量的值:

PS C:\> $false -eq 'False'
错误的
PS C:\> $false -eq 'True'
错误的
PS C:\> $true -eq 'False'
真的
PS C:\> $true -eq '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
}

1
投票

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

if($Path)
或者
if(!$Path)

但我可能是错的,因为我无法测试自动取款机。

此外还有

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


0
投票

为了澄清一些事情,请始终使用 Test-Path(或带有 Leaf 的 Test-Path 来检查文件)。

我测试过的例子:

$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!"
}
© www.soinside.com 2019 - 2024. All rights reserved.