簡體   English   中英

Powershell-使用.csv或.txt中的列表為重復的文件分配唯一的文件名

[英]Powershell - Assigning unique file names to duplicated files using list inside a .csv or .txt

我對Powershell本身僅執行基本任務(例如簡單的重命名或移動文件)的經驗有限,但是我從未創建過一個需要實際從文件內部提取信息並將該數據直接應用於文件名的程序。 。

我想創建一個腳本,該腳本可以引用包含唯一標識符列表的簡單.csv或文本文件,並將其分配給一批重復的文件(它們都具有相同的內容),這些文件在其中共享一個稍有不同的名稱3位數字的形式,附加為通用名稱的前綴。

例如,假設我的文件列表如下所示:

  • 001_test.txt
  • 002_test.txt
  • 003_test.txt
  • 004_test.txt
  • 005_test.txt

等等

然后,我的.csv包含我希望成為的字母順序列表:

  • Alpha.txt
  • Beta.txt
  • Charlie.txt
  • Delta.txt
  • 回聲

等等

我嘗試看過類似的示例,但我慘遭失敗,試圖對它們進行定制以使其達到上述目的。

編輯:我沒有保存已經修改過的內容,但這是我正在使用的基准腳本:

$file_server = Read-Host "Enter the file server IP address"

$rootFolder = 'C:\TEMP\GPO\source\5'

Get-ChildItem -LiteralPath $rootFolder -Directory |
Where-Object { $_.Name -as [System.Guid] } |
ForEach-Object {
$directory = $_.FullName

(Get-Content "$directory\gpreport.xml") |
ForEach-Object { $_ -replace "99.999.999.999", $file_server } |
Set-Content "$directory\gpreport.xml"

# ... etc
}

我認為這雖然是替換文件中的字符串。 我需要使用另一個文件(未重命名)中的列表替換文件名本身,同時不更改要重命名的文件的內容。

我沒有測試過,但是應該很接近。 假設您有一個帶有名為FileNames的列的CSV,並且該列表中的名稱至少與磁盤上的名稱一樣多。

$newNames = Import-Csv newfilenames.csv | Select -ExpandProperty FileNames

$existingFiles = Get-ChildItem c:\someplace

for ($i = 0; $i -lt $existingFiles.count; $i++)
{ 
    Rename-Item -Path $existingFiles[$i].FullName -NewName $newNames[$i]
}

基本上,您將創建兩個數組,並使用基本的for循環逐步瀏覽磁盤上的文件列表,然后從newNames數組中的相應索引中提取名稱。

您的CSV文件是否將標識符映射到文件名?

Identifier,NewName
001,Alpha
002,Beta

如果是這樣,則需要在重命名文件之前查找標識符:

# Define the naming convention
$Suffix = '_test'
$Extension = 'txt'

# Get the files and what to rename them to
$Files = Get-ChildItem "*$Suffix.$Extension"
$Csv = Import-Csv 'Names.csv'

# Rename the files
foreach ($File in $Files) {
    $NewName = ($Csv | Where-Object { $File.Name -match '^' + $_.Identifier } | Select-Object -ExpandProperty NewName)
    Rename-Item $File "$NewName.$Extension"
}

如果您的CSV文件只是文件名的順序列表,那么邏輯圖的答案可能更多地是您要查找的內容。

因此,您想使用文本文件中列出的文件來重命名類似的文件。 好的,這是我的解決方案(括號中列出的別名)所需的內容:Get-Content(GC),Get-ChildItem(GCI),Where(?),Rename-Item,ForEach(%)

$NewNames = GC c:\temp\Namelist.txt    #Path, including file name, to list of new names
$Name = "dog.txt"   #File name without the 001_ prefix
$Path = "C:\Temp"    #Path to search
$i=0
GCI $path | ?{$_.Name -match "\d{3}_$Name"}|%{Rename-Item $_.FullName $NewNames[$i];$i++}

經測試可正常工作。 這將獲取新名稱列表,並將其保存為數組。 然后,它定義您的文件名,路徑,並將$i設置$i 0作為計數器。 然后對於每個您的模式它重命名它基於一次性項目數量的匹配文件$i的新名字數組中,然后遞增$i了一個號碼,並移動到下一個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM