windows - Windows 如何将GUID附加到现有文件名并保存到 CSV

  显示原文与译文双语对照的内容
120 5

我目前有一个包含 1列的CSV,其中列出了许多文件 FullNames 。( IE 。"\serversubfolderfile 。ext") 。

我试图导入这个 CSV,将文件移到一个单独的位置,并将GUID添加到新位置( IE guid_file.ext )的文件名开头。我能够移动文件,生成GUID_但没有能够存储和重用现有的filename.ext,,文件只是一个 GUID_ 。我只是不确定如何存储现有的文件名以便重用。

$Doc = Import-CSV C:Tempscripttest.csv
ForEach ($line in $Doc)
{
 $FileBase = $Line.basename 
 $FileExt = $Line.extension 
Copy-Item -path $line.File -Destination"\ServerFolder$((new-guid).guid.replace('-',''))_$($Filebase)$($FileExt)"
}

如果可以能,我还需要将所有新的GUID_File.ext 存储并放置到一个CSV中,并将任何错误存储到另一。

时间:原作者:0个回答

117 5

如果我仔细阅读你的问题,你需要:

  • 复制'文件'列中的CSV文件中列出的文件。
  • 新文件应该在文件名前有一个 GUID
  • 你需要一个新的CSV文件,其中存储新文件名以便以后参考
  • 你想跟踪任何错误并将这些错误写入( 日志) 文件

假设你有一个输入CSV文件,它看起来像这样:

File,Author,MoreStuff
serversubfolderfile.ext,Someone,Blah
serversubfolderfile2.ext,Someone Else,Blah2
serversubfolderfile3.ext,Same Someone,Blah3

那么下面的脚本希望你所希望的。它通过将一个GUID和一个在 File 中列出的文件复制到一些目标路径来创建新文件名。它在目标文件夹中输出一个新的CSV文件,如下所示:

OriginalFile,NewFile
serversubfolderfile.ext,anotherserversubfolder38f7bec9e4c0443081b385277a9d253d_file.ext
serversubfolderfile2.ext,anotherserversubfolderd19546f7a3284ccb995e5ea27db2c034_file2.ext
serversubfolderfile3.ext,anotherserversubfolderedd6d35006ac46e294aaa25526ec5033_file3.ext

任何错误都列在日志文件( 也在目标文件夹中) 中。

$Destination = 'ServerFolder'
$ResultsFile = Join-Path $Destination 'Copy_Results.csv'
$Logfile = Join-Path $Destination 'Copy_Errors.log'
$Doc = Import-CSV C:Tempscripttest.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("yyy-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("yyy-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
原作者:
67 2

我目前有一个包含 1列的CSV,其中列出了许多文件 FullNames 。( IE 。" serversubfolderfile.ext") 。

这不是 CSV 。它只是一个带有列表的纯文本文件。

下面是你实现目标的方法:

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

这将采取你的列表,将项转换成可以以使用的FileInfo 类型,并执行它的他逻辑。

原作者:
147 4

基于:

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

听起来你错误地认为 $line 实例代表的对象是从 Import-Csv C:Tempscripttest.csv 返回的对象是 [System.IO.FileInfo] 实例,但它们不是:

输出是 [pscustomobject] 实例are它的属性反映输入CSV的列值,而这些属性的值总是字符串。

因这里,你必须使用 $line.<column1Name> 引用包含完整文件名的列,它的中 <column1Name> 是输入CSV文件的头行( 1st 行) 中的名称。

CSV文件的标题行,你可以通过将列名的array 传递给参数的Import-Csv-Header 。e.g. ,和,来指定列名称。
Import-Csv -Header Path, OtherCol1, OtherCol2,.. . C:Tempscripttest.csv

我假设感兴趣的列在以下解决方案中命名为 Path:

$Doc = Import-Csv C:Tempscripttest.csv
ForEach ($rowObject in $Doc)
{
 $fileName = Split-Path -Leaf $rowObject.Path
 Copy-Item -Path $rowObject.Path `
 -Destination"ServerFolder$((new-guid).guid.replace('-',''))_$fileName"
}

注意 Split-Path -Leaf 如何用于从完整输入路径中提取文件名,包括扩展。

原作者:
127 0

感谢你的解决方案。所有的工作都正常工作。我选择了作为解决方案,他解决了错误日志记录并将新的命名为 GUID_File.ext的文件存储到现有CSV信息。

谢谢大家。

原作者:
...