2011-04-29 40 views

Respuesta

6

Trate expresiones regulares:

$foo = 'something_of_unknown' -replace 'something.*','something' 

O si usted sabe sólo parcialmente la 'algo', por ejemplo,

'something_of_unknown' -replace '(some[^_]*).*','$1' 
'some_of_unknown' -replace '(some[^_]*).*','$1' 
'somewhatever_of_unknown' -replace '(some[^_]*).*','$1' 

El $1 es referencia a grupo en paréntesis (la parte (some[^_]*)).

Editar (después cambiada pregunta):

Si utiliza expresiones regulares, a continuación, tienen que ser escapado caracteres especiales:

"\\unknowntext1\alwaysSame\unknowntext2" -replace '\\\\unknowntext1.*', '\\unknowntext1' 

o (otra magia de expresiones regulares) utiliza de búsqueda hacia atrás como esto:

"\\unknowntext1\alwaysSame\unknowntext2" -replace '(?<=\\\\unknowntext1).*', '' 

(que es: tomar cualquier cosa (.*), pero debe haber \\unknowntext1 antes ('(?<=\\\\unknowntext1)) y reemplazarlo por una cadena vacía.

Editar (última)

Si sabe que hay algo que se conoce en el medio (la alwaysSame), esto podría ayudar:

"\\unknowntext1\alwaysSame\unknowntext2" -replace '(.*?)\\alwaysSame.*', '$1' 
+0

por favor me Downvote, soy muy malo. – AshClarke

+0

Edité la respuesta, pero como ahora veo, tengo que editarla una vez más;) – stej

5
function Remove-TextAfter { 
    param (
     [Parameter(Mandatory=$true)] 
     $string, 
     [Parameter(Mandatory=$true)] 
     $value, 
     [Switch]$Insensitive 
    ) 

    $comparison = [System.StringComparison]"Ordinal" 
    if($Insensitive) { 
     $comparison = [System.StringComparison]"OrdinalIgnoreCase" 
    } 

    $position = $string.IndexOf($value, $comparison) 

    if($position -ge 0) { 
     $string.Substring(0, $position + $value.Length) 
    } 
} 

Remove-TextAfter "something_of_unknown" "SoMeThInG" -Insensitive 
+0

Gracias por el formato 'System.StringComparison'. ; ^) – ruffin

3

Lo que tengo es $ var = "\ unknowntext1 \ alwaysSame \ unknowntext2"

Necesito conservar solo "\ unknowntext1 "

No estoy seguro de que esto requiera una expresión regular. Suponiendo alwaysSame es, literalmente, siempre la misma, ya que la discusión en torno a la respuesta de Stej sugiere, parece, con mucho, la forma más sencilla de lograr esto sería:

$var.substring(0, $var.indexOf("\alwaysSame"));

+0

¿Cómo no responde eso la pregunta? Si tiene '$ var =" \\ unknowntext1 \ alwaysSame \ unknowntext2 "' y ejecuta '$ var.substring (0, $ var.indexOf (" \ alwaysSame "));', obtiene '\\ unknowntext1', * QED *. Estaba sorprendido de que las otras respuestas no fueran trivialmente más intrincadas. – ruffin

+0

Noto que ninguno de ustedes (Hashem y Lucas) tiene una etiqueta 'powershell' en su perfil. Las líneas de código de Powershell siempre * emiten sus resultados a la "tubería", si eso te está lanzando.Esa declaración en mi respuesta "devolverá" el valor solicitado por el OP; cada línea de código de PowerShell es una especie de función implícita que puede encadenarse a otro comando posterior. Puedo ver cómo eso podría haberte confundido. También edité la respuesta para que mi intención sea más clara para los usuarios que no son de PS. – ruffin

Cuestiones relacionadas