Powershell - 使用.csv或.txt中的列表为复制文件指定唯一文件名

时间:2014-07-31 19:36:39

标签: powershell csv

我对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
  • Echo.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
}

我认为这是替换文件中的字符串。我需要使用另一个文件中的列表(未重命名)替换文件名本身,同时不更改正在重命名的文件的内容。

3 个答案:

答案 0 :(得分:0)

我没有测试过这个,但它应该非常接近。它假定您有一个名为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数组中的相应索引中提取名称。

答案 1 :(得分:0)

您的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文件只是一个文件名的顺序列表,那么logicaldiagram的回答可能更符合你所寻找的内容。

答案 2 :(得分:0)

因此,您希望将类似文件重命名为文本文件中列出的文件。好的,这就是我的解决方案所需要的内容(括号中列出的别名):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设置为0作为计数器。然后,对于与您的模式匹配的每个文件,它将根据新名称数组中的项目编号$i重命名,然后将$i向上递增一个数字并移至下一个文件。