我需要帮助将文件名称(不是文件本身)从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.txt
将D:\MyFiles\thisfile.docx
重命名为D:\MyFiles\myfile.txt
有没有办法编辑Powershell代码,只重命名文件名的 base (例如myFile
),同时保留目标文件' 扩展程序(例如.docx
)?
C:\MyFiles\myfile.txt
使用
D:\MyFiles\thisfile.docx
重命名为D:\MyFiles\myfile.docx
答案 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*
)。