PowerShell传递日期变量给Get-Content报错:找不到匹配的位置参数
解决PowerShell中文件名拼接传递给Get-Content的错误问题
错误原因
你的代码采用单引号包裹路径并搭配+拼接变量的方式不符合PowerShell语法规则:单引号字符串不会解析内部变量,且这种拼接方式会将命令拆分为多个参数,导致Get-Content把+20220923+识别为额外的位置参数,从而触发报错。
正确写法
方法1:双引号嵌入变量(最简洁)
PowerShell中双引号会自动解析内部变量,直接将$Today嵌入路径字符串即可:
$Today = Get-Date -Format "yyyyMMdd" Get-Content "D:\Folder_1\Test_file.$Today.csv" | Set-Content -Encoding UTF8 "D:\Folder_2\Test_file.$Today.csv"
注意:原代码使用-Encoding Ascii不符合转UTF8的需求,需改为-Encoding UTF8。PowerShell 5.1中该参数默认生成带BOM的UTF8,若需无BOM格式可参考方法3。
方法2:先拼接为变量再传递
将路径拼接成独立变量后再传给命令,逻辑更清晰:
$Today = Get-Date -Format "yyyyMMdd" $sourcePath = 'D:\Folder_1\Test_file.' + $Today + '.csv' $targetPath = 'D:\Folder_2\Test_file.' + $Today + '.csv' Get-Content $sourcePath | Set-Content -Encoding UTF8 $targetPath
方法3:格式字符串(适合复杂路径)
用-f运算符格式化字符串,适配多变量组合场景:
$Today = Get-Date -Format "yyyyMMdd" $sourcePath = 'D:\Folder_1\Test_file.{0}.csv' -f $Today $targetPath = 'D:\Folder_2\Test_file.{0}.csv' -f $Today Get-Content $sourcePath | Set-Content -Encoding UTF8 $targetPath
无BOM UTF8输出补充(PowerShell 5.1)
PowerShell 5.1中Set-Content -Encoding UTF8默认生成带BOM的文件,若需无BOM格式,可使用.NET类方法:
$Today = Get-Date -Format "yyyyMMdd" $sourcePath = "D:\Folder_1\Test_file.$Today.csv" $targetPath = "D:\Folder_2\Test_file.$Today.csv" $content = Get-Content $sourcePath -Raw [System.IO.File]::WriteAllLines($targetPath, $content, [System.Text.Encoding]::UTF8)
PowerShell 7+版本中,Set-Content -Encoding UTF8默认即为无BOM格式,无需额外处理。
内容的提问来源于stack exchange,提问作者Sebax Londoño
相关产品推荐
相关产品推荐

