我有一个脚本,它将具有特定扩展名的文件从源目录移动到目标目录。
我的源目录如下:
FILESFOLDER
File1.td
File2.td
SUBFOLDER
File3.td
File4.td
我的脚本很短,看起来像:
if(!(Test-Path $SourceDirPath) -or !(Test-Path $DestinationDirPath))
{
Write-Host "The source- or destination path is incorrect, please check "
break
}else
{
Write-Host "Success"
Copy-Item -path $SourceDirPath -Filter "*$extension" -Destination $DestinationDirPath -Recurse
}
我必须提及 $SourceDirPath
来自配置文件,只有在我声明为C:\FILESFOLDER\*
时才有效
该脚本有效,但不会将文件从子文件夹复制到目标。目的地只有File1和File2。
我的Copy-Item命令出了什么问题?
答案 0 :(得分:3)
-Recurse
开关对您的案例无效,因为它仅适用于$SourceDirPath
组合所匹配的项目,后者使用尾随\*
}匹配源目录中 的项目,以及-Filter
,在您的情况下,只是源目录中直接的*.td
个文件
省略尾随\*
以定位目录本身(例如,C:\FOLDER
而不是C:\FOLDER\*
),原则上解决了问题,但是,due to an annoying quirk 只有在目标目录不的情况下才能正常工作。
如果它存在,则项目将放置在目标目录的子目录中,并以源目录命名。
如果在复制之前现有目标目录中没有任何内容可以保留(并且目录本身的特殊属性不需要保留,则可以通过删除预先存在的目标目录。
if(!(Test-Path $SourceDirPath) -or !(Test-Path $DestinationDirPath))
{
Write-Host "The source or destination path is incorrect, please check "
break
}
else
{
Write-Host "Success"
# Delete the preexisting destination directory,
# which is required for the Copy-Item command to work as intended.
# BE SURE THAT IT IS OK TO DO THIS.
Remove-Item $DestinationDirPath -Recurse
# Note: $SourceDirPath must NOT end in \*
Copy-Item -Recurse -LiteralPath $SourceDirPath -Filter "*$extension" -Destination $DestinationDirPath
}
如果您确实需要保留现有的$DestinationDirPath
内容或属性(ACL,...),则需要做更多的工作。
答案 1 :(得分:1)
您应该将Get-ChildItem
cmdlet与-recurse
参数一起使用,以根据您的过滤条件检索所有文件。然后,您可以将结果通过管道传输到Copy-Item
cmdlet,只需指定目标。
答案 2 :(得分:1)
因此,这将比较目录源与目标,然后复制内容。忽略我的时髦变量,我已经在编辑
下修改了它们 #Release folder
$Source = ""
#Local folder
$Destination = ""
#Find all the objects in the release
get-childitem $Source -Recurse | foreach {
$SrcFile = $_.FullName
$SrcHash = Get-FileHash -Path $SrcFile -Algorithm MD5 # Obtain hash
$DestFile = $_.Fullname -replace [RegEx]::escape($Source),$Destination #Escape the hash
Write-Host "comparing $SrcFile to $DestFile" -ForegroundColor Yellow
if (Test-Path $DestFile)
{
#Check the hash sum of the file copied
$DestHash = Get-FileHash -Path $DestFile -Algorithm MD5
#compare them up
if ($SrcHash.hash -ne $DestHash.hash) {
Write-Warning "$SrcFile and $DestFile Files don't match!"
Write-Warning "Copying $SrcFile to $DestFile "
Copy-Item $SrcFile -Destination $DestFile -Force
}
else {
Write-Host "$SrcFile and $DestFile Files Match" -ForegroundColor
Green
}
}
else {
Write-host "$SrcFile is missing! Copying in" -ForegroundColor Red
Copy-Item $SrcFile -Destination $DestFile -Force
}
}
答案 3 :(得分:1)
试试这个:
$source = "C:\Folder1"
$destination = "C:\Folder2"
$allfiles = Get-ChildItem -Path $source -Recurse -Filter "*$extension"
foreach ($file in $allfiles){
if (test-path ($file.FullName.replace($source,$destination))) {
Write-Output "Seccess"
Copy-Item -path $file.FullName -Destination ($file.FullName.replace($source,$destination))
}
else {
Write-Output "The source- or destination path is incorrect, please check "
break
}
}