假设我有一个文件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部分。
答案 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 处匹配。基于Ansgar的答案,因此可以如下简化脚本:
Param($xmlfile)
$db = ((Get-ChildItem C:\Files -Filter $xmlfile).BaseName -replace '_PARTIAL$').ToUpper()
请注意,由于member enumeration和$xmlfile
接受的能力,即使在PSv3 +中,即使-replace
应该与多个文件匹配,该方法仍然有效。作为输入的字符串数组,所需的子字符串删除将在所有文件的基本名称上执行,随后的大写也将如此-$db
随后将收到一个数组剥离的基本名称。