Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell命令修剪路径(如果路径以“结束”)\&引用;_Powershell_Filepath_Text Parsing_Ends With - Fatal编程技术网

Powershell命令修剪路径(如果路径以“结束”)\&引用;

Powershell命令修剪路径(如果路径以“结束”)\&引用;,powershell,filepath,text-parsing,ends-with,Powershell,Filepath,Text Parsing,Ends With,如果路径以\结尾,我需要修剪路径 C:\Ravi\ 我需要换成 C:\Ravi 我有一个例子,路径不会以\结尾(那么它必须跳过) 我尝试了使用.EndsWith(“\”),但在使用\而不是\时失败 这可以在PowerShell中不借助条件实现吗?无需过度复杂化 "C:\Ravi\".trim('\') 考虑改用TrimEnd(尤其是在使用UNC路径时): 您提到需要区分以“\”和“\”结尾的路径,并可能以不同的方式处理这些路径。虽然您可以使用.Trim(“\”或.TrimEnd(“\”删除

如果路径以
\
结尾,我需要修剪路径

C:\Ravi\
我需要换成

C:\Ravi
我有一个例子,路径不会以
\
结尾(那么它必须跳过)

我尝试了使用
.EndsWith(“\”
),但在使用
\
而不是
\
时失败


这可以在PowerShell中不借助条件实现吗?

无需过度复杂化

"C:\Ravi\".trim('\')

考虑改用
TrimEnd
(尤其是在使用
UNC
路径时):


您提到需要区分以“\”和“\”结尾的路径,并可能以不同的方式处理这些路径。虽然您可以使用
.Trim(“\”
.TrimEnd(“\”
删除示例中的尾随“\”字符,但这两种方法都将从路径中删除所有尾随斜杠

如果路径以单个“\”结尾,则以下正则表达式将返回True,如果路径以多个“\”字符结尾,则返回false:

$Path -match '.+[^\\]\\$'
regex是指:

  • 由尽可能多的字符组成的字符串
  • 不是反斜杠的东西
  • 后跟一个反斜杠
  • 给予:

    "C:\Ravi\" -match '.+[^\\]\\$'
    True
    
    "C:\Ravi\\" -match '.+[^\\]\\$'
    False
    
    希望这有帮助/有趣。:-)

    注意:只有当您需要最多修剪2个尾随
    \
    字符,想要支持
    /
    路径分隔符,想要正确处理根路径,或者通常对正则表达式技术感兴趣时,此解决方案才有意义。
    如果可以修剪任何尾随
    \
    字符的非空运行,即也可以修剪3个或更多字符(在本例中很可能是这样),并且根路径不需要特殊处理,请使用。

    一种基于PowerShell的解决方案,它具有一个可同时处理尾部
    \
    \
    并可与
    /
    一起使用的路径分隔符,因为PowerShell接受
    \
    /
    作为路径分隔符(这也将使解决方案与跨平台版PowerShell Core一起工作):[1]

    • [\\/]
      是一个字符类(
      […]
      ),它匹配单个字符,这些字符要么是
      \
      (转义为
      \
      ,被视为文字)要么是
      //code>

    • [\\/]?[\\/]
      匹配字符串末尾(
      $
      )的一个或两个
      \
      实例,
      [\\/]+
      更松散地匹配一个或多个(
      +

    • 不指定替换字符串会有效地从字符串中删除匹配项;如果没有匹配项,则输入字符串保持原样

    为了证明该方法适用于多种路径,包括UNC路径:

    'C:\Ravi', 'C:\Ravi\', 'C:/Ravi/', 'C:\Ravi\\', '\\foo\bar\',  'C:\', '\' | % { 
      $_ -replace '[\\/]?[\\/]$'
    }
    
    上述收益率:

    C:\Ravi
    C:\Ravi
    C:/Ravi
    C:\Ravi
    \\foo\bar
    C:
     
    
    但是,请注意,根路径的处理是有问题的
    C:\
    被转换为
    C:
    ,并且
    \
    导致空字符串

    在这些特殊情况下,通过留下一个尾随的
    \
    ,需要一个非常复杂的正则表达式(通过匹配任意数量的尾随路径分隔符稍微简化):

    这将产生:

    C:\Ravi
    C:\Ravi
    C:\
    C:\
    \
    \
    
    C:\Ravi\
    C:\Ravi\
    C:\
    C:\
    \
    \
    
    请注意根路径现在是如何以(一)
    \
    结尾的

    C:\Ravi\
    
    根路径的特殊大小写很麻烦,这就是为什么有时最好确保而不是删除尾随
    \
    /
    (例如,
    C:\Ravi
    ->
    C:\Ravi\
    ),以便通过简单的字符串连接方便地构建路径(无需担心字符数加倍。);正则表达式再次变得简单:

    'C:\Ravi', 'C:\Ravi\', 'C:\', 'C:\\', '\', '\\' | % { 
      ($_ -replace '[\\/]+$') + '\'
    }
    
    这将产生:

    C:\Ravi
    C:\Ravi
    C:\
    C:\
    \
    \
    
    C:\Ravi\
    C:\Ravi\
    C:\
    C:\
    \
    \
    
    请注意,所有路径现在如何以(一)
    \
    结尾

    C:\Ravi\
    


    [1] 有时,字符串操作是必要的,但通常您可以依靠来为自己构建路径,它可以优雅地处理目录部分中的尾随
    \
    (例如,
    连接路径C:\Ravi\file.txt
    生成
    C:\Ravi\file.txt
    )相反,后面的
    \
    被保留:
    连接路径C:\Ravi\\file.txt
    产生
    C:\Ravi\\file.txt
    ;然而,虽然这并不漂亮,但通常是良性的(这样的路径仍然可以访问文件系统).

    为什么需要修剪此路径?根据您的要求,可能有更好的处理方法(例如,如果您将字符串连接到路径中,
    Join path
    将在不修剪的情况下为您处理).@alroc我不是在构建路径。我是在提取路径,然后根据需要进行定义。
    分割路径
    可能会对您有用。这是可行的,但因为它从两端修剪,所以不适用于基于UNC的路径,例如
    \\foo\bar
    “\\server\Ravi\”。trimend(“\”)将修复UNC路径。