答案1
我对这个问题的回答做了一些修改:批处理文件:列出某种类型的所有文件,重命名文件,展平目录
它会执行您想要的操作:使用通配符复制文件、展平目录结构、处理文件名冲突。它使用建议Get-ChildItem
的Tᴇcʜιᴇ007
。
# Setup source and destination paths
$Src = '\\Server\Apps'
$Dst = 'C:\ReadMeFiles'
# Wildcard for filter
$Extension = '*ReadMe.txt'
# Get file objects recursively
Get-ChildItem -Path $Src -Filter $Extension -Recurse |
# Skip directories, because XXXReadMe.txt is a valid directory name
Where-Object {!$_.PsIsContainer} |
# For each file
ForEach-Object {
# If file exist in destination folder, rename it with directory tag
if(Test-Path -Path (Join-Path -Path $Dst -ChildPath $_.Name))
{
# Get full path to the file without drive letter and replace `\` with '-'
# [regex]::Escape is needed because -replace uses regex, so we should escape '\'
$NameWithDirTag = (Split-Path -Path $_.FullName -NoQualifier) -replace [regex]::Escape('\'), '-'
# Join new file name with destination directory
$NewPath = Join-Path -Path $Dst -ChildPath $NameWithDirTag
}
# Don't modify new file path, if file doesn't exist in target dir
else
{
$NewPath = $Dst
}
# Copy file
Copy-Item -Path $_.FullName -Destination $NewPath
}
答案2
这是 Copy-Item 的一个已知问题,您无法在源中指定通配符,也无法使用 Recurse(并使其按预期工作)。
如果您不介意复制文件夹结构(但只复制自述文件),请尝试使用“过滤器”选项。例如:
Copy-Item \\Server\Apps\ C:\ReadMeFiles\ -Filter *ReadMe.txt -Recurse
或者,您可以将 Get-Child-Item 与 Recurse 一起使用,并使用 For 循环一次向 Copy-Item 提供文件。