使用PowerShell迁移CSV文件至外部服务器遇未复制提示问题求助
问题排查与解决
核心问题分析
你的代码执行后全走「Not copying」的原因是时间范围逻辑完全错误,同时还有两处不符合需求的细节:
- 时间条件矛盾:
- 你写的
$EarliestModifiedTime = (Get-Date).AddMinutes(200).Date会得到「当前日期的0点」(因为.Date会截断时间部分到00:00:00),$LatestModifiedTime = (Get-Date).Date同样是「当前日期的0点」。 - 条件
($_.CreationTime -ge $EarliestModifiedTime) -and ($_.CreationTime -lt $LatestModifiedTime)永远无法成立——没有任何时间能同时大于等于某个值且小于同一个值。 - 另外注释标注的是“adds 30 min”,但代码里写的是
AddMinutes(200),明显是笔误。
- 你写的
- 未过滤.csv文件:你用
Get-ChildItem "C:\s1\*.*"会遍历所有类型文件,不符合迁移.csv的需求。 - 外部服务器路径问题:如果目标是外部服务器,不能用本地C盘路径,需要改用UNC格式(比如
\\RemoteServerName\SharedFolder\d1\)。
修正后的代码
根据你注释里提到的「all day yesterday」(迁移昨天全天创建的.csv文件),修正后的代码如下:
$DestinationFolder = "\\RemoteServer\SharedFolder\d1\" # 替换为实际外部服务器UNC路径 $SourceFolder = "C:\s1\" # 确保目标目录存在 If (-not (Test-Path $DestinationFolder)) { New-Item -ItemType Directory -Force -Path $DestinationFolder | Out-Null } # 定义时间范围:昨天0点 到 今天0点(即昨天全天) $YesterdayStart = (Get-Date).Date.AddDays(-1) $TodayStart = (Get-Date).Date # 仅遍历源目录下的.csv文件 Get-ChildItem -Path $SourceFolder -Filter "*.csv" | ForEach-Object { if ($_.CreationTime -ge $YesterdayStart -and $_.CreationTime -lt $TodayStart) { Copy-Item -Path $_.FullName -Destination $DestinationFolder -Force Write-Host "Copied $($_.Name)" } else { Write-Host "Not copying $($_.Name) - 创建时间不在目标范围内" } }
如果你的实际需求是迁移最近30分钟内创建的.csv文件(对应你注释里的“adds 30 min”),只需修改时间部分:
# 定义时间范围:当前时间往前推30分钟 $EarliestTime = (Get-Date).AddMinutes(-30) Get-ChildItem -Path $SourceFolder -Filter "*.csv" | ForEach-Object { if ($_.CreationTime -ge $EarliestTime) { Copy-Item -Path $_.FullName -Destination $DestinationFolder -Force Write-Host "Copied $($_.Name)" } else { Write-Host "Not copying $($_.Name) - 创建时间超过30分钟" } }
关键修改点说明
- 用
-Filter "*.csv"精准筛选.csv文件,比*.*更高效。 - 修正时间范围逻辑,确保条件能正确匹配目标文件。
- 外部服务器目标路径改用UNC格式(
\\服务器名\共享目录\),需确保当前用户有该共享目录的读写权限。 - 使用
$_.FullName作为Copy-Item的路径,避免相对路径可能导致的问题。 - 添加
| Out-Null抑制New-Item的输出,让控制台更整洁。
内容的提问来源于stack exchange,提问作者Bartek
相关产品推荐
相关产品推荐

