1

我有一个脚本尝试使用相对路径运行一些可执行文件。
所以我test-path用来验证可执行文件是否在它应该在的位置。如果没有,我尝试另一个位置。

if(test-path "$current../../../myexe.exe"){
   # found it!
}

但在这种情况下,如果 $currentC:/folder/test-path "C:/folder/../../../myexe.exe"失败

路径 ... 引用了基础“C:”之外的项目

是否有一种干净而可靠的方法来测试路径,以便它返回真或假,并且不会给我带来一些意外错误?

4

4 回答 4

2
Test-Path ([io.path]::Combine($current,(Resolve-Path ../../../myexe.exe)))

有关更多信息,请参阅此线程

于 2013-04-09T11:12:49.773 回答
2

我让它使用 .NET 工作,但如果你想正确解析相对路径File.Exists,你必须设置第一个。Environment.CurrentDirectory

编辑:在 Shay Levy 指出它对其他后台进程可能是危险的之后不更改 CurrentDirectory(请参阅http://www.leeholmes.com/blog/2006/06/26/current-working-directory-with-powershell-and -net-calls/ )

 [环境]::CurrentDirectory = $pwd

[System.IO.File].Exists("$pwd\$invalidRelativePath")
False
于 2013-04-09T11:29:31.100 回答
2

测试路径从根本上被破坏了。

甚至SilentlyContinue也坏了:

Test-Path $MyPath -ErrorAction SilentlyContinue 

如果 $MyPath 为 $null、空或不作为变量存在,这仍然会爆炸。

如果 $MyPath 只是一个空格,它甚至会返回 $true。那个“”文件夹到底在哪里!

以下是适用于以下情况的解决方法:

$MyPath = "C:\windows"  #Test-Path return $True as it should
$MyPath = " "       #Test-Path returns $true, Should return $False
$MyPath = ""        #Test-Path Blows up, Should return $False
$MyPath = $null      #Test-Path Blows up, Should return $False
Remove-Variable -Name MyPath -ErrorAction SilentlyContinue  #Test-Path Blows up, Should return $False

解决方案在于在 Test-Path 想要炸毁时强制它返回 $False。

if ( $(Try { Test-Path $MyPath.trim() } Catch { $false }) ) {  #Returns $false if $null, "" or " "
    write-host "path is GOOD"
} Else {
    write-host "path is BAD"
}
于 2015-06-10T14:01:34.373 回答
0

您应该使用 Resolve-Path 或 Join-Path

于 2014-03-03T09:49:14.423 回答