我有一个相当简单的PS脚本,可以很好地运行,现在突然开始出现错误。我已将问题部分缩小为几个Get-Content语句。这是脚本受影响的部分的样子:
$pathSource = "D:\FileDirectory"
Set-Location -Path $pathSource
Get-Content -Encoding UTF8 -Path FilesA*.txt | Out-File -Encoding ASCII FilesA_Digest.txt
Get-Content -Encoding UTF8 -Path FilesB*.txt | Out-File -Encoding ASCII FilesB_Digest.txt
脚本的这一部分收集了一组名称相同的文件,并将它们连接为单个文本文件,以上传到FTP站点。需要Get-Content / Out-File,因为FTP站点的原始文件编码不正确。该脚本运行良好,每晚运行一次,持续几个星期。现在,当到达Get-Content语句时,它将得到以下错误:
Get-Content : A parameter cannot be found that matches parameter name 'Encoding'.
At D:\FileDirectory\Script.ps1
环境是Windows Server2016。我曾尝试过对Get-Content参数进行各种变体,但没有任何效果。我知道有一个错误会影响网络映射的驱动器,但事实并非如此-所有文件都是本地的。
有什么想法/建议吗?
答案 0 :(得分:1)
我能想到的唯一合理的解释是,缺少Get-Content
参数的 custom -Encoding
命令是 shadowing (在执行脚本的PowerShell会话中覆盖)标准Get-Content
cmdlet 。
演示:
# Define a custom Get-Content command (function) that accepts only
# a (positional) -Path parameter, not also -Encoding.
function Get-Content { [CmdletBinding()] param([string] $Path) }
# Now try to use Get-Content -Encoding
Get-Content -Encoding Utf8 FilesA*.txt
您将看到与问题相同的错误消息。
使用Get-Command Get-Content -All
查看所有名为Get-Content
的命令,并首先列出 effective 命令。
然后检查任何自定义命令可能来自何处;例如,您的$PROFILE
脚本可能包含一个。
要排除$PROFILE
作为罪魁祸首,请在不加载配置文件脚本的情况下启动PowerShell并检查Get-Content
,然后:
powershell -noprofile # Windows PowerShell
pwsh -noprofile # PowerShell Core
一种排除自定义替代的简单方法临时 是通过模块限定名称 调用命令strong>:
Microsoft.Powershell.Management\Get-Content ...
您可以按以下方式确定内置cmdlet的模块源名称:
PS> (Get-Command Get-Content -All)[-1].ModuleName
Microsoft.PowerShell.Management
在紧急情况下,您还可以从帮助主题的 URL 推断原始模块名称:
Get-Content
将带您进入https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content-请注意,cmdlet的模块名称microsoft.powershell.management
(大小写无关)是倒数第二个(倒数第二个)URI组件。 答案 1 :(得分:0)
out命令似乎有问题。您能尝试下面的代码吗?
$pathSource = "D:\FileDirectory"
Set-Location -Path $pathSource
Get-Content -Encoding UTF8 -Path FilesA*.txt | Set-Content -Encoding ASCII -path FilesA_Digest.txt
Get-Content -Encoding UTF8 -Path FilesB*.txt | Set-Content -Encoding ASCII -path FilesB_Digest.txt
答案 2 :(得分:0)
嗯,我不知道为什么它失败了,但是我可以说我已经完全重写了脚本,现在它可以工作了。我必须指出,鉴于发生的错误,我也不知道为什么它现在可以工作。
我正在使用与-Encoding参数完全相同的对Get-Content Commandlet的调用,并使用具有其自己的-Encoding参数的至Out-File的管道。我正在执行与以前版本的脚本完全相同的操作。唯一显着不同的部分是执行已处理文件的FTP传输的部分。我现在仅使用PowerShell而不是CuteFTP来执行传输,这一切似乎都可以正常工作。
感谢所有贡献者。
欢呼 规范