将文件名从一个文件夹复制到另一个文件夹,同时保留原始扩展

时间:2018-04-18 01:04:21

标签: windows file powershell renaming

我需要帮助将文件名称(不是文件本身)从C盘复制到D盘。我能够在线找到以下powershell代码:

$names = @()
$getPath = "C:\MyFiles"
$setPath = "D:\MyFiles"
Get-ChildItem $getPath |
    Foreach-object{
    $names += $_
}
$i = 0
Get-ChildItem $setPath |
Foreach-object{
    Rename-Item -Path $_.FullName -NewName $names[$i]
    $i++
}

此代码成功地将所有文件名从C:\MyFiles重命名/复制到D:\MyFiles,严格地通过相应的位置(枚举中的索引)。

但是,它也在更新扩展,例如:

C:\MyFiles\myfile.txtD:\MyFiles\thisfile.docx重命名为D:\MyFiles\myfile.txt

有没有办法编辑Powershell代码,只重命名文件名的 base (例如myFile),同时保留目标文件' 扩展程序(例如.docx)?

C:\MyFiles\myfile.txt使用

D:\MyFiles\thisfile.docx重命名为D:\MyFiles\myfile.docx

1 个答案:

答案 0 :(得分:3)

听起来您希望根据源目录中的相应文件重命名在目标目录位置中的文件 - 同时保留目标目录文件'扩展:

ObservationCare
  • 预览生成的文件名,请将$getPath = "C:\MyFiles" $setPath = "D:\MyFiles" $sourceFiles = Get-ChildItem -File $getPath $iRef = [ref] 0 Get-ChildItem -File $setPath | Rename-Item -NewName { $sourceFiles[$iRef.Value++].BaseName + $_.Extension } 附加到-WhatIf来电。

  • Rename-Item输出的.BaseName个对象的[System.IO.FileInfo]属性返回没有扩展名的文件名部分。

  • Get-ChildItem提取输入文件(即目标文件)的现有扩展名,包括前导$_.Extension

  • 请注意,传递给.的脚本块({ ... })会创建一个变量范围,因此您无法在调用者中增加变量'范围直接(它会每次创建一个具有原始值的变量的新副本);因此,创建Rename-Item实例以间接保存数字,然后子范围可以通过[ref]属性进行修改。

这是完整示例

注意:虽然此示例使用类似的文件名和统一扩展名,但代码使用一般任何名称和扩展名。功能

.Value

以上产量:

# Determine the temporary paths.
$getPath = Join-Path ([System.IO.Path]::GetTempPath()) ('Get' + $PID)
$setPath = Join-Path ([System.IO.Path]::GetTempPath())  ('Set' + $PID)

# Create the temp. directories.
$null = New-Item -ItemType Directory -Force $getPath, $setPath

# Fill the directories with files.

# Source files: "s-file{n}.source-ext"
"--- Source files:"
1..3 | % { New-Item -ItemType File (Join-Path $getPath ('s-file{0}.source-ext' -f $_)) } | 
  Select -Expand Name

# Target files: "t-file{n}.target-ext"
"
---- Target files:"
1..3 | % { New-Item -ItemType File (Join-Path $setPath ('t-file{0}.target-ext' -f $_)) } | 
  Select -Expand Name

# Get all source names.
$sourceFiles = Get-ChildItem -File $getPath

# Perform the renaming, using the source file names, but keeping the
# target files' extensions.
$i = 0; $iVar = Get-Variable -Name i
Get-ChildItem -File $setPath | 
  Rename-Item -NewName { $sourceFiles[$iVar.Value++].BaseName + $_.Extension }

"
---- Target files AFTER RENAMING:"

Get-ChildItem -Name $setPath

# Clean up.
Remove-Item -Recurse $getPath, $setPath

注意目标文件现在如何拥有源文件'基本文件名(--- Source files: s-file1.source-ext s-file2.source-ext s-file3.source-ext ---- Target files: t-file1.target-ext t-file2.target-ext t-file3.target-ext ---- Target files AFTER RENAMING: s-file1.target-ext s-file2.target-ext s-file3.target-ext ),但目标文件'原始扩展程序(s-file*)。