powershell - 将 CSV 中的文件路径修剪为存储在变量中的某个路径/文件名
问题描述
我有一个 PowerShell 脚本,它将文件的完整路径以及其他一些信息存储在特定目录中。我已导出 CSV 文件。现在,这些路径实际上被组合在一起以构成完整路径。下面我举个例子:
$root= C:\Users\home\
$web = facebook website\domain
$app = facebook android\latest
Join-Path
然后将这些路径与或连接在一起$fbweb = $root + $web
以构成完整路径:C:\Users\home\facebook website\domain
现在,上面提到的路径中将包含其他文件、子文件夹等,但这就是路径结构的要点。我已将它们导出到 CSV 文件中,但遇到以下问题。$web
我需要 CSV 文件以这样的方式具有路径,以便修剪掉通向的部分。
例如,如果 CSV 文件是这样的:
Path
C:\Users\home\facebook website\domain\version\version-feb-2020.txt
C:\Users\home\facebook website\domain\interface\somefile.html
C:\Users\home\facebook android\latest\messenger\messenger app files\code.js
C:\Users\home\facebook android\latest\application\somecode.js
我希望它变成这样:
Path
facebook website\domain
\version\version-feb-2020.txt
\interface\somefile.html
facebook android\latest
\messenger\messenger app files\code.js
application\somecode.js
我尝试使用以下方法将其修剪掉:
$number = [regex]::matches($fbweb,"\\").count
Select-Object Hash,
@{
Name = "FilePath";
Expression = { [string]::Join("\", ($_.Path -split "\\" | Select-Object -skip ($number)))}
}
更新:我试过这个:
$replace = Join-Path -Path $root -ChildPath $web
echo $replace
$RefHash = Import-csv "C:\Users\Admin\Desktop\fb.csv"
$RefHash | ForEach-Object {
echo $_.Path
($_.Path).Replace($replace, "\")
} | Export-csv "C:\Users\Admin\Desktop\replaced.csv"
但这只会导致导出的 csv 显示以下内容:
#TYPE System.String
"Length"
"numbers"
"numbers"
"numbers"
解决方案
如前所述,您有 2 种方法来管理它:
- 将 csv 文件视为文本文件并在获取内容上进行替换:
(Get-Content -Path "C:\temp\TestMD5.csv").Replace($replace, "\") | Set-Content "C:\temp\TestMD5updated.csv"
- 导入 CSV,分离每个参数,修改您需要的内容,然后构建一个 pscustomobject,然后将其导出为 csv:
#Preparing variables
$scriptdir = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Path)
$sourcecsv = Import-csv -path "C:\temp\TestMD5.csv"
$obj = @()
$root = "C:\Temp"
$web = "Test01\Test02\"
$replace = Join-Path -Path $root -ChildPath $web
$target = "\"
#Executing replace
foreach ($line in $sourcecsv) {
$object = New-Object -TypeName psobject
$algo = $line | Select-Object -ExpandProperty 'Algorithm'
$Hash = $line | Select-Object -ExpandProperty 'Hash'
$Path = ($line | Select-Object -ExpandProperty 'Path').Replace($replace, $target)
$object | Add-Member -MemberType NoteProperty -Name Algorithm -Value $algo
$object | Add-Member -MemberType NoteProperty -Name Hash -Value $Hash
$object | Add-Member -MemberType NoteProperty -Name Path -Value $Path
$obj += $object
$object
}
$obj | Export-Csv -NoTypeInformation -Path "$scriptdir\UpdatedVars.csv"
第一个更快,第二个为您提供灵活性,允许您构建泛化的函数并根据需要修改其他参数。
推荐阅读
- python - 如何将列表中的数字乘以自己
- android - 如何在 Unity 中的 Android 上本地测试 AssetBundle (DLC)?
- python - 在字符串列表中查找子字符串列表的索引;填写缺失值
- java - JAX RS:无法使用 Websphere 自由核心将 JSON 转换为对象
- python - 需要帮助反向遍历python中的字符串列表,一旦找到带有数字的字符串,返回之前的所有内容
- c++ - C ++:在重新分配而不是复制中引用类对象
- html - Img Srcset 属性未选择较小的图像
- c# - 将 C 标头转换为 C# - ByValArray 与 ByValTStr 用于结构内的固定字符数组
- javascript - 将查询结果推送到对象中
- xcode - 使用 Postgis 从 Postgres 10 升级到 11