Как добавить GUID к существующим именам файлов и сохранить в CSV - PullRequest
0 голосов
/ 29 августа 2018

В настоящее время у меня есть CSV, который содержит 1 столбец, в котором перечислены многие файлы FullNames. (т. е. "\\ server \ sub \ folder \ file.ext").

Я пытаюсь импортировать этот файл CSV, переместить файл в отдельное место и добавить GUID к началу имени файла в новом месте (то есть GUID_File.ext). Я был в состоянии переместить файлы, сгенерировать GUID_, но не смог сохранить и повторно использовать существующее имя файла. Ext, оно просто обрезается, и файл заканчивается просто как GUID_ Я просто не уверен, как сохранить существующее имя файла для повторного использования.

$Doc = Import-CSV C:\Temp\scripttest.csv

ForEach ($line in $Doc)
{
 $FileBase = $Line.basename 
 $FileExt = $Line.extension 
Copy-Item -path  $line.File -Destination "\\Server\Folder\$((new-guid).guid.replace('-',''))_$($Filebase)$($FileExt)"
}

Если возможно, мне также понадобится сохранить и поместить все новые GUID_File.ext обратно в CSV-файл и сохранить любые ошибки в другом файле.

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Спасибо всем за решения. Все они работали и работали хорошо. Я выбрал Тео в качестве ответа за тот факт, что его решение решило проблему регистрации ошибок и сохранило все новые переименованные файлы с GUID_File.ext, новым для существующей информации CSV.

Спасибо всем.

0 голосов
/ 29 августа 2018

На основании:

$FileBase = $line.basename
$FileExt = $line.extension

звучит так, как будто вы ошибочно думаете, что $line экземпляры, представляющие объекты, возвращенные из Import-Csv C:\Temp\scripttest.csv, являются [System.IO.FileInfo] экземплярами, но это не так:

Какие Import-Csv выходы являются [pscustomobject] экземплярами, чьи свойства отражают значения столбцов входного CSV, а значения этих свойств неизменно строки .

Поэтому необходимо использовать $line.<column1Name> для ссылки на столбец, содержащий полные имена файлов, где <column1Name> - это имя, определенное для интересующего столбца в строке заголовка (1-й строке) входного файла CSV.

Если в CSV-файле нет строки заголовка, вы можете указать имена столбцов, передав массив имен столбцов параметру Import-Csv -Header, например,
Import-Csv -Header Path, OtherCol1, OtherCol2, ... C:\Temp\scripttest.csv

Я предполагаю, что интересующий столбец называется Path в следующем решении:

$Doc = Import-Csv C:\Temp\scripttest.csv

ForEach ($rowObject in $Doc)
{
  $fileName = Split-Path -Leaf $rowObject.Path
  Copy-Item -Path $rowObject.Path `
            -Destination "\\Server\Folder\$((new-guid).guid.replace('-',''))_$fileName"
}

Обратите внимание, как Split-Path -Leaf используется для извлечения имени файла, включая расширение, из полного пути ввода.

0 голосов
/ 29 августа 2018

Если я внимательно прочитал ваш вопрос, вы хотите:

  • скопировать файлы, указанные в файле CSV в столбце «Файл».
  • новые файлы должны иметь GUID, добавленный к имени файла
  • вам нужен новый CSV-файл, в котором хранятся новые имена файлов для дальнейшего использования
  • вы хотите отслеживать любые ошибки и записывать их в (лог) файл

Предположим, у вас есть входной CSV-файл, который выглядит примерно так:

File,Author,MoreStuff
\\server\sub\folder\file.ext,Someone,Blah
\\server\sub\folder\file2.ext,Someone Else,Blah2
\\server\sub\folder\file3.ext,Same Someone,Blah3

Тогда скрипт ниже, надеюсь, сделает то, что вы хотите. Он создает новые имена файлов, добавляя к ним GUID, и копирует файлы в CSV, перечисленные в столбце File, в некоторый путь назначения. Он выводит новый CSV-файл в папку назначения следующим образом:

OriginalFile,NewFile
\\server\sub\folder\file.ext,\\anotherserver\sub\folder\38f7bec9e4c0443081b385277a9d253d_file.ext
\\server\sub\folder\file2.ext,\\anotherserver\sub\folder\d19546f7a3284ccb995e5ea27db2c034_file2.ext
\\server\sub\folder\file3.ext,\\anotherserver\sub\folder\edd6d35006ac46e294aaa25526ec5033_file3.ext

Любые ошибки перечислены в файле журнала (также в папке назначения).

$Destination = '\\Server\Folder'
$ResultsFile = Join-Path $Destination 'Copy_Results.csv'
$Logfile     = Join-Path $Destination 'Copy_Errors.log'
$Doc         = Import-CSV C:\Temp\scripttest.csv

# create an array to store the copy results in
$result = @()
# loop through the csv data using only the column called 'File'
ForEach ($fileName in $Doc.File) {
    # check if the given file exists; if not then write to the errors log file
    if (Test-Path -Path $fileName -PathType Leaf) {
        $oldBaseName = Split-Path -Path $fileName.Path -Leaf
        # or do $oldBaseName = [System.IO.Path]::GetFileName($fileName)
        $newBaseName = "{0}_{1}" -f $((New-Guid).toString("N")), $oldBaseName
        # (New-Guid).toString("N") returns the Guid without hyphens, same as (New-Guid).Guid.Replace('-','')

        $destinationFile = Join-Path $Destination $newBaseName
        try {
            Copy-Item -Path $fileName -Destination $destinationFile -Force -ErrorAction Stop
            # add an object to the results array to store the original filename and the full filename of the copy
            $result += New-Object -TypeName PSObject -Property @{
                'OriginalFile' = $fileName
                'NewFile'      = $destinationFile
            }
        }
        catch {
            Write-Error "Could not copy file to '$destinationFile'"
            # write the error to the log file
            Add-content $Logfile -Value "$((Get-Date).ToString("yyyy-MM-dd HH:mm:ss")) - ERROR: Could not copy file to '$destinationFile'"
        }
    }
    else {
        Write-Warning "File '$fileName' does not exist"
        # write the error to the log file
        Add-content $Logfile -Value "$((Get-Date).ToString("yyyy-MM-dd HH:mm:ss")) - WARNING: File '$fileName' does not exist"
    }
}
# finally create a CSV with the results of this copy.
# the CSV will have two headers 'OriginalFile' and 'NewFile'
$result | Export-Csv -Path $ResultsFile -NoTypeInformation -Force
0 голосов
/ 29 августа 2018

В настоящее время у меня есть CSV, который содержит 1 столбец, в котором перечислены многие файлы FullNames. (т. е. "\ server \ sub \ folder \ file.ext").

Это не CSV. Это просто текстовый файл со списком.

Вот как вы можете достичь своей цели, однако:

foreach ($path in (Get-Content -Path C:\Temp\scripttest.csv))
{
    $file = [System.IO.FileInfo]$path
    $prefix = (New-Guid).Guid -replace '-'
    Copy-Item -Path $file.FullName -Destination "\\Server\Folder\${prefix}_$file"
}

Это возьмет ваш список, преобразует элемент в тип FileInfo, с которым он может работать, и сделает всю остальную логику.

...