如何删除文件名的一部分?

时间:2019-03-13 23:27:31

标签: powershell

假设我有一个文件Hello this is a description. I know Just chekcing how it looks. Add a line. This is a notmal line Adding orange * one * two

我正在尝试从“ _partial”以及扩展名(xml)中剥离文件,然后将名称大写,使其变为database_partial.xml

DATABASE

返回Param($xmlfile) $xml = Get-ChildItem "C:\Files" -Filter "$xmlfile" $db = [IO.Path]::GetFileNameWithoutExtension($xml).ToUpper() ,但我不知道如何去除_PARTIAL部分。

2 个答案:

答案 0 :(得分:2)

您不需要GetFileNameWithoutExtension()即可删除扩展名。 FileInfo返回的Get-ChildItem对象具有属性BaseName,该属性为您提供不带扩展名的文件名。将其大写,然后删除“ _PARTIAL”后缀。我还建议以循环方式处理Get-ChildItem的输出,以防万一它没有完全返回一个结果。

Get-ChildItem "C:\Files" -Filter "$xmlfile" | ForEach-Object {
    $_.BaseName.ToUpper().Replace('_PARTIAL', '')
}

如果下划线后的子字符串可能有所不同,请使用正则表达式替换而不是字符串替换,例如像这样:

Get-ChildItem "C:\Files" -Filter "$xmlfile" | ForEach-Object {
    $_.BaseName.ToUpper() -replace '_[^_]*$'
}

答案 1 :(得分:1)

Ansgar Wiechers's helpful answer提供了有效的解决方案。

着眼于以下更普遍的问题:如何剥离(删除)文件名(字符串)的一部分

使用PowerShell的-replace operator,其语法为:
<stringOrStrings> -replace <regex>, <replacement>

  • <regex>是与要替换的零件相匹配的 regex regular expression
  • <replacement>替换操作数(用于替换正则表达式匹配的字符串)。
    • 为了有效地删除正则表达式匹配的内容,请指定''(空字符串)或简单地忽略操作数-两种情况下,有效地从输入字符串中删除匹配的部分。

有关-replace的更多信息,请参见this answer

适用于您的情况:

$db = 'DATABASE_PARTIAL' # sample input value

PS> $db -replace '_PARTIAL$', ''  # removes suffix '_PARTIAL' from the end (^)
DATABASE

PS> $db -replace '_PARTIAL$'      # ditto, with '' implied as the replacement string.
DATABASE

注意:

    默认情况下,
  • -replace不区分大小写 ,所有PowerShell运算符也是如此。要明确执行区分大小写的 匹配,请使用-creplace变体。

  • 相比之下,[string]类型的.Replace()方法(例如$db.Replace('_PARTIAL', '')

    • 仅匹配字符串文字,因此灵活性较低;在这种情况下,您不能规定_PARTIAL仅应在字符串的 end 处匹配。
    • 在.NET Framework中,
    • 始终区分大小写 (尽管.NET Core 提供了不区分大小写的重载)。

基于Ansgar的答案,因此可以如下简化脚本:

Param($xmlfile)

$db = ((Get-ChildItem C:\Files -Filter $xmlfile).BaseName -replace '_PARTIAL$').ToUpper()

请注意,由于member enumeration$xmlfile接受的能力,即使在PSv3 +中,即使-replace应该与多个文件匹配,该方法仍然有效。作为输入的字符串数组,所需的子字符串删除将在所有文件的基本名称上执行,随后的大写也将如此-$db随后将收到一个数组剥离的基本名称。