根据特定字符删除字符串的前面部分。 (\)

Posted

技术标签:

【中文标题】根据特定字符删除字符串的前面部分。 (\\)【英文标题】:Removing the front part of a string based on an specific character. (\)根据特定字符删除字符串的前面部分。 (\) 【发布时间】:2021-02-12 20:53:48 【问题描述】:

我首先使用 Cmdlet Get-ChildItem 在目录(和子目录)中创建包含文件列表的数组,并将它们存储在变量中

$PSVariable = (Get-ChildItem -Path "F:\SQL_Backups" -Recurse *.bak).FullName

我回显变量($PSVariable),这是我的输出(根据需要):

F:\SQL_Backups\INTRAPORTAL\StoreDevelopment\StoreDevelopment_backup_2021_02_11_003002_3930170.bak F:\SQL_Backups\INTRAPORTAL\StoreDevelopment\StoreDevelopment_backup_2021_02_12_003002_4780885.bak F:\SQL_Backups\JDASQL\DEVMOD\DEVMOD_backup_2021_02_10_190002_5130923.bak F:\SQL_Backups\JDASQL\DEVMOD\DEVMOD_backup_2021_02_11_190003_7621021.bak

目标: 我需要从每个数组条目中删除目录路径,因此它只包含将存储在 foreach 循环内的临时变量中的文件名:

StoreDevelopment_backup_2021_02_11_003002_3930170.bak StoreDevelopment_backup_2021_02_12_003002_4780885.bak DEVMOD_backup_2021_02_10_190002_5130923.bak DEVMOD_backup_2021_02_11_190003_7621021.bak

有些人会建议在 Get-ChildItem 命令中简单地使用 (.Name),但我需要数组同时具有路径和文件名 (FullName),因为数组的内容正在用于函数的其他部分。我是正则表达式的新手,我似乎无法在目标部分得到结果。我什至尝试过使用 trim() 方法,但没有运气。任何建议将不胜感激。谢谢。

【问题讨论】:

如果你必须有两个独立的数组,为什么不$files = Get-ChildItem -Path "F:\SQL_Backups" -File -Recurse *.bak; $fullNames = $files.FullName; $names = $files.Name 我还是不知道你为什么可以使用$PSVariable = Get-ChildItem -Path "F:\SQL_Backups" -File -Recurse *.bak | Select FullName,Name,Directory。然后在需要时使用$PSVariable.Fullname$PSVariable.Name 对于延迟响应(其他项目),我深表歉意。 @AdminOfThings 推荐的内容可以解决我的问题。我不确定我最初的想法是什么导致我正在设置的东西失控。 【参考方案1】:

扩展@AdminOfThings 推荐的内容,您为自己做的工作超出了您的需要。 PowerShell 是一种基于对象的脚本语言,所以要成功,您应该使用它的全部力量。

您现在采用的方法是只从这个有用的对象中获取一个属性,然后发现您需要开始对其进行切片和切块才能使其工作。

有一个更简单的方法。我们喜欢这里的简单,而简单的方法是获取完整的对象,然后在有意义的地方挑选和选择它的属性,如下所示:

$i = 0 
#changed to remove the .FullName at then end
$PSVariable = (Get-ChildItem -Path "F:\SQL_Backups" -Recurse *.bak) 
ForEach ($item in $psVariable)
   $i++
   Write-host "Processing [$($item.Name)], item number $i of $($psVariable.Count)"

   Copy-item -Path $item.FullName -Destination C:\temp -WhatIf


它为您提供有意义的输出,然后您可以使用完整的属性选择。

正如您在上面提到的那样,最适合使用的就是.Name。但是你仍然有.FullName,其中也包括合格的路径。

如果您想查看完整的属性选择,请尝试以下操作:

$PsVariable[0] | Format-list *

【讨论】:

【参考方案2】:

仅作为 FoxDeploy 的次要选项提供,您也可以使用 Split-Path 从路径获取文件名

$PSVariable = (Get-ChildItem -Path "F:\SQL_Backups" -Recurse *.bak).FullName
$PSVariable | Split-Path -Leaf

【讨论】:

以上是关于根据特定字符删除字符串的前面部分。 (\)的主要内容,如果未能解决你的问题,请参考以下文章

根据十六进制值从字符串中删除特定字符

怎么用JS把特定字符串重复的字符删除留下一个

在Python中的特定字符之后删除部分字符串

在 Objective-C 中删除字符串的特定部分

删除特定分隔符后面的字符串的最后部分

oracle怎么截取指定字符后面的字符串,或者删除指定字符前面的字符串也行