我正在尝试处理一个文件列表,这些文件可能是也可能不是最新的,可能存在也可能不存在.在这样做时,我需要解析项目的完整路径,即使该项目可能使用相对路径指定.但是,Resolve-Path
与不存在的文件一起使用时会出现打印和错误.
例如,什么是最简单的化解,干净的方式".\newdir\newfile.txt"
来"C:\Current\Working\Directory\newdir\newfile.txt"
使用PowerShell?
请注意,System.IO.Path
静态方法与进程的工作目录一起使用 - 这不是powershell的当前位置.
x0n*_*x0n 78
你要:
c:\path\exists\> $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath(".\nonexist\foo.txt")
Run Code Online (Sandbox Code Playgroud)
收益:
c:\path\exists\nonexists\foo.txt
Run Code Online (Sandbox Code Playgroud)
这样做的好处是可以使用PSPath,而不是本机文件系统路径.PSPAth可能不会将1-1映射到文件系统路径,例如,如果您安装具有多字母驱动器名称的psdrive.
-Oisin
jos*_*hls 26
当Resolve-Path
失败是由于文件不存在,完全解决路径是从抛出Error对象访问.
您可以使用以下功能来修复Resolve-Path
并使其按预期工作.
function Force-Resolve-Path {
<#
.SYNOPSIS
Calls Resolve-Path but works for files that don't exist.
.REMARKS
From http://devhawk.net/blog/2010/1/22/fixing-powershells-busted-resolve-path-cmdlet
#>
param (
[string] $FileName
)
$FileName = Resolve-Path $FileName -ErrorAction SilentlyContinue `
-ErrorVariable _frperror
if (-not($FileName)) {
$FileName = $_frperror[0].TargetObject
}
return $FileName
}
Run Code Online (Sandbox Code Playgroud)
Kei*_*ill 14
我认为你走的是正确的道路.只需使用[Environment] :: CurrentDirectory设置.NET的进程当前目录的概念,例如:
[Environment]::CurrentDirectory = $pwd
[IO.Path]::GetFullPath(".\xyz")
Run Code Online (Sandbox Code Playgroud)
这样做的好处是无需设置CLR Environment的当前目录:
[IO.Path]::Combine($pwd,"non\existing\path")
Run Code Online (Sandbox Code Playgroud)
这在功能上与x0n的答案不同.System.IO.Path.Combine
仅组合字符串路径段.它的主要功能是让开发人员不必担心斜线.GetUnresolvedProviderPathFromPSPath
将根据.
's和..
' 来遍历相对于当前工作目录的输入路径.
Join-Path (Resolve-Path .) newdir\newfile.txt
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
15946 次 |
最近记录: |