根据特定字符删除字符串的前面部分。 (\)
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
【讨论】:
以上是关于根据特定字符删除字符串的前面部分。 (\)的主要内容,如果未能解决你的问题,请参考以下文章