首页 > 解决方案 > 将 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"

标签: powershell

解决方案


如前所述,您有 2 种方法来管理它:

  1. 将 csv 文件视为文本文件并在获取内容上进行替换:
(Get-Content -Path "C:\temp\TestMD5.csv").Replace($replace, "\") | Set-Content "C:\temp\TestMD5updated.csv"
  1. 导入 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" 

第一个更快,第二个为您提供灵活性,允许您构建泛化的函数并根据需要修改其他参数。


推荐阅读