Powershell Get-Content虚假失败

时间:2019-02-03 22:42:49

标签: powershell

我有一个相当简单的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参数进行各种变体,但没有任何效果。我知道有一个错误会影响网络映射的驱动器,但事实并非如此-所有文件都是本地的。

有什么想法/建议吗?

3 个答案:

答案 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 推断原始模块名称:

答案 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来执行传输,这一切似乎都可以正常工作。

感谢所有贡献者。

欢呼 规范