基本上我想检查目录是否存在,然后运行此部分,如果不存在则退出。
我的脚本是:
$Path = Test-Path c:\temp\First
if ($Path -eq "False")
{
Write-Host "notthere" -ForegroundColor Yellow
}
elseif ($Path -eq "true")
{
Write-Host " what the smokes"
}
但它什么也没返回。
错误来自于
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"
}
在比较操作中,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
}
如果我没记错的话,可以简单地说:
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
为了澄清一些事情,请始终使用 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!"
}