PowerShell中DateTime.TryParseExact参数数量错误问题排查
PowerShell脚本中TryParseExact参数错误的修复方案
错误原因
调用[datetime]::TryParseExact时出现的Cannot find an overload for "TryParseExact" and the argument count: "5"错误,是因为该方法的5参数重载要求第三个参数必须是有效的[CultureInfo]文化对象,不能直接传入$null。同时原代码的if语句缺少一个闭合括号,也会导致语法问题。
修复方案
1. 修正参数与语法
将第三个参数替换为[CultureInfo]::InvariantCulture(不受系统区域设置影响,适配DD MMM格式的英文日期),同时补全if语句的闭合括号。
2. 修正后的完整脚本
$basePath = "C:\Path\To\Your\Folders" $currentYear = (Get-Date).Year # 遍历所有子文件夹 Get-ChildItem -Path $basePath -Directory | ForEach-Object { $folder = $_ $folderName = $folder.Name # 尝试解析带当前年份的日期 $dateParsed = $null # 替换$null为InvariantCulture,补全闭合括号 if ([datetime]::TryParseExact("$folderName $currentYear", "dd MMM yyyy", [CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::None, [ref]$dateParsed)) { $dayOfWeekNum = [int]$dateParsed.DayOfWeek # 0=周日, 1=周一, ..., 6=周六 switch ($dayOfWeekNum) { 1 { $subfolders = @("vishal", "rajnita", "tashi") } # 周一 2 { $subfolders = @("rajoo", "vidula") } # 周二 default { Write-Host "跳过 $folderName - $($dateParsed.DayOfWeek)无需操作" return } } # 创建所需子文件夹 foreach ($sub in $subfolders) { $newPath = Join-Path $folder.FullName $sub if (-not (Test-Path $newPath)) { New-Item -Path $newPath -ItemType Directory | Out-Null Write-Host "已创建: $newPath" } else { Write-Host "已存在: $newPath" } } } else { Write-Host "格式无效: $folderName" } }
额外优化建议
如果不想拼接年份字符串,也可以直接解析原文件夹名,再手动设置年份,避免字符串拼接的麻烦:
# 直接解析原文件夹名(DD MMM格式) if ([datetime]::TryParseExact($folderName, "dd MMM", [CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::None, [ref]$dateParsed)) { $dateParsed = $dateParsed.AddYears($currentYear - $dateParsed.Year) # 设置为当前年份 # 后续逻辑不变 }
内容的提问来源于stack exchange,提问作者tama donna
相关产品推荐
相关产品推荐

