基本上,我想检查目录是否存在,如果没有退出,请运行此部分。
我的脚本是:
$Path = Test-Path c:\temp\First
if ($Path -eq "False")
{
Write-Host "notthere" -ForegroundColor Yellow
}
elseif ($Path -eq "true")
{
Write-Host " what the smokes"
}
但是它什么也不返回。
答案 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!"
}