PowerShell脚本中变量无法正确获取文件创建时间的解决方法
问题根因
你的代码存在执行顺序错误:所有读取单个文件创建时间的变量,都定义在了foreach循环外部。
代码实际运行逻辑是:
- 运行到
$FileCreationTime = $file.CreationTime等取值语句时,foreach循环还未启动,$file变量没有被赋值为当前遍历的xml文件对象 - 后续才执行
Get-ChildItem拉取文件列表、进入循环遍历文件 - 循环外未赋值的
$file如果匹配到当前会话中之前操作过的源文件夹对象,就会直接读取文件夹的创建时间,取值不会随循环内的文件切换更新。
修复方案
将所有依赖单个$file对象的变量定义,全部移动到foreach的循环代码块内部,保证每遍历到一个文件,就重新读取当前文件的创建时间属性。
另外注意路径字符串要使用英文半角双引号,不要用中文弯引号,避免路径解析错误。
修复后的参考代码:
# 拉取目标文件列表的逻辑放在循环外即可 $files = Get-ChildItem "C:\Test Folder\*.xml" foreach($file in $files) { # 所有和当前文件属性相关的取值,全部放在循环块内 $FileCreationTime = $file.CreationTime $YearMonthDate = $FileCreationTime.ToString("yyMMdd") $MonthDate = $FileCreationTime.ToString("MMdd") $YearMonth = $FileCreationTime.ToString("yyMM") $Year = $FileCreationTime.ToString("yyyy") $Month = $FileCreationTime.ToString("MM") $Day = $FileCreationTime.ToString("dd") # 后续归档逻辑写在循环内即可,示例: # 1. 拼接一级年份目录路径,不存在则创建 $firstLevelDir = Join-Path "C:\你的归档根路径" $Year if (-not (Test-Path $firstLevelDir)) { New-Item -ItemType Directory -Path $firstLevelDir | Out-Null } # 2. 按预设规则计算日期区间,拼接二级目录路径 # 3. 将当前$file移动到对应二级目录下 }
内容的提问来源于stack exchange,提问作者MTSW
相关产品推荐
相关产品推荐

