Tengo dos caminos:
fred\frog
y
..\frag
Puedo unirlos en PowerShell de esta manera:
join-path 'fred\frog' '..\frag'
Eso me da esto:
fred\frog\..\frag
Pero yo no quiero eso. Quiero una ruta normalizada sin los puntos dobles, como este:
fred\frag
¿Cómo puedo conseguirlo?
powershell
path
dan-gph
fuente
fuente
Respuestas:
Se puede utilizar una combinación de
pwd
,Join-Path
y[System.IO.Path]::GetFullPath
para obtener una ruta ampliada completo.Dado que
cd
(Set-Location
) no cambia el directorio de trabajo actual del proceso, simplemente pasar un nombre de archivo relativo a una API .NET que no comprende el contexto de PowerShell puede tener efectos secundarios no deseados, como resolver una ruta basada en el trabajo inicial. directorio (no su ubicación actual).Lo que haces es primero calificar tu camino:
Esto produce (dada mi ubicación actual):
Con una base absoluta, es seguro llamar a la API .NET
GetFullPath
:Lo que le brinda la ruta completamente calificada y con lo
..
eliminado:Tampoco es complicado, personalmente, desdeño las soluciones que dependen de scripts externos para esto, es un problema simple resuelto con bastante acierto por
Join-Path
ypwd
(GetFullPath
es solo para hacerlo bonito). Si solo desea conservar solo la parte relativa , simplemente agregue.Substring((pwd).Path.Trim('\').Length + 1)
y ¡listo!ACTUALIZAR
Gracias a @Dangph por señalar el
C:\
caso de borde.fuente
cd c:\; "C:\fred\frag".Substring((pwd).Path.Length + 1)
. No es gran cosa; solo algo a tener en cuenta.cd c:\; "C:\fred\frag".Substring((pwd).Path.Trim('\').Length + 1)
. Aunque se está haciendo un poco largo.Puede expandir .. \ frag a su ruta completa con resolve-path:
Intente normalizar la ruta usando el método combine ():
fuente
C:\Windows
contraC:\Windows\
la misma ruta pero dos resultados diferentes[io.path]::Combine
están invertidos. Mejor aún, use elJoin-Path
comando nativo de PowerShell:Join-Path (Resolve-Path ..\frag).Path 'fred\frog'
tenga en cuenta también que, al menos a partir de PowerShell v3,Resolve-Path
ahora es compatible con el-Relative
conmutador para resolver una ruta relativa a la carpeta actual. Como se mencionó,Resolve-Path
solo funciona con rutas existentes, a diferencia de[IO.Path]::GetFullPath()
.También puede usar Path.GetFullPath , aunque (como con la respuesta de Dan R) esto le dará la ruta completa. El uso sería el siguiente:
o más interesante
ambos producen lo siguiente (asumiendo que su directorio actual es D: \):
Tenga en cuenta que este método no intenta determinar si fred o frag realmente existen.
fuente
[System.IO.Directory]::SetCurrentDirectory(((Get-Location -PSProvider FileSystem).ProviderPath))
[IO.Path]::GetFullPath()
diferencia del nativo de PowerShellResolve-Path
, también funciona con rutas inexistentes. Su desventaja es la necesidad de sincronizar primero la carpeta de trabajo de .NET con la de PS, como señala @JasonMArcher.Join-Path
provoca una excepción si se refieren a una unidad que no existe.La respuesta aceptada fue de gran ayuda, sin embargo, tampoco 'normaliza' adecuadamente una ruta absoluta. Encuentre a continuación mi trabajo derivado que normaliza rutas absolutas y relativas.
fuente
[IO.Path]::GetFullPath()
, no determina correctamente el directorio para un nombre de archivo simple.Cualquier función de manipulación de ruta que no sea de PowerShell (como las de System.IO.Path) no será confiable desde PowerShell porque el modelo de proveedor de PowerShell permite que la ruta actual de PowerShell difiera de lo que Windows cree que es el directorio de trabajo del proceso.
Además, como ya habrá descubierto, los cmdlets Resolve-Path y Convert-Path de PowerShell son útiles para convertir rutas relativas (las que contienen '..' s) en rutas absolutas calificadas por la unidad, pero fallan si la ruta a la que se hace referencia no existe.
El siguiente cmdlet muy simple debería funcionar para rutas inexistentes. Convertirá 'fred \ frog \ .. \ frag' a 'd: \ fred \ frag' incluso si no se puede encontrar un archivo o carpeta 'fred' o 'frag' (y la unidad PowerShell actual es 'd:') .
fuente
Get-AbsolutePath q:\foo\bar\..\baz
falla a pesar de que es una ruta válida. Bueno, dependiendo de su definición de una ruta válida. :-) FWIW, incluso el integradoTest-Path <path> -IsValid
falla en rutas enraizadas en unidades que no existen.HKLM:\SOFTWARE
es una ruta válida en PowerShell, que hace referencia a laSOFTWARE
clave en el subárbol de registro de la máquina local. Pero para averiguar si es válido, necesita averiguar cuáles son las reglas para las rutas de registro.Esta biblioteca es buena: NDepend.Helpers.FileDirectoryPath .
EDITAR: Esto es lo que se me ocurrió:
Llámalo así:
Tenga en cuenta que este fragmento requiere la ruta a la DLL. Hay un truco que puede usar para encontrar la carpeta que contiene el script que se está ejecutando actualmente, pero en mi caso tenía una variable de entorno que podía usar, así que simplemente la usé.
fuente
Esto da la ruta completa:
Esto da la ruta relativa al directorio actual:
Por alguna razón, solo funcionan si
frag
es un archivo, no undirectory
.fuente
Crea una función. Esta función normalizará una ruta que no existe en su sistema y no agregará letras de unidades.
Ex:
Gracias a Oliver Schadlich por su ayuda en la RegEx.
fuente
somepaththing\.\filename.txt
ya que mantiene ese único puntoSi la ruta incluye un calificador (letra de unidad), entonces la respuesta de x0n a Powershell: ¿resolver la ruta que podría no existir? normalizará el camino. Si la ruta no incluye el calificador, aún se normalizará, pero devolverá la ruta completamente calificada en relación con el directorio actual, que puede no ser lo que desea.
fuente
Si necesita deshacerse de la parte .., puede usar un objeto System.IO.DirectoryInfo. Use 'fred \ frog .. \ frag' en el constructor. La propiedad FullName le dará el nombre del directorio normalizado.
El único inconveniente es que le dará la ruta completa (por ejemplo, c: \ test \ fred \ frag).
fuente
Las partes convenientes de los comentarios aquí se combinan de manera que unifican caminos relativos y absolutos:
Algunas muestras:
salida:
fuente
Bueno, una forma sería:
Espera, quizás no entiendo bien la pregunta. En su ejemplo, ¿frag es una subcarpeta de frog?
fuente