Powershell获取内容错误失败

Powershell获取内容错误失败,powershell,Powershell,我有一个相当简单的PS脚本,它工作得非常好,现在突然开始出现错误。我已经将问题部分缩小为两个Get内容语句。以下是脚本受影响部分的外观: $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

我有一个相当简单的PS脚本,它工作得非常好,现在突然开始出现错误。我已经将问题部分缩小为两个Get内容语句。以下是脚本受影响部分的外观:

$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站点。由于FTP站点的原始文件编码不正确,因此需要获取内容/输出文件。脚本运行得很好,连续几周每晚运行一次。现在,当到达Get Content语句时,会出现以下错误:

Get-Content : A parameter cannot be found that matches parameter name 'Encoding'.
At D:\FileDirectory\Script.ps1
环境是Windows Server 2016。我尝试了不同的Get-Content参数变体,但没有任何效果。我知道有一个bug会影响网络映射驱动器,但这里的情况并非如此——所有文件都是本地文件


有什么想法/建议吗?

我能想到的唯一合理的解释是,一个缺少
-Encoding
参数的自定义
获取内容
命令正在执行脚本的PowerShell会话中隐藏(覆盖)标准
获取内容
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
的所有命令,首先列出有效命令

然后检查任何自定义命令可能来自何处;e、 例如,您的
$PROFILE
脚本可能包含一个

若要排除
$PROFILE
为罪魁祸首,请在不加载配置文件脚本的情况下启动PowerShell并检查
获取内容
,然后:

powershell -noprofile  # Windows PowerShell
pwsh -noprofile        # PowerShell Core
排除自定义临时覆盖的一种简单方法是通过其模块限定名调用命令:

Microsoft.Powershell.Management\Get-Content ...
您可以按如下方式确定内置cmdlet的源模块名称:

PS> (Get-Command Get-Content -All)[-1].ModuleName
Microsoft.PowerShell.Management
在紧急情况下,您还可以从帮助主题的URL推断出源模块名称:

Microsoft.Powershell.Management\Get-Content ...
  • 谷歌搜索
    Get Content
    将带您去-注意cmdlet的模块名
    microsoft.powershell.management
    (大小写不重要)是如何成为倒数第二个(倒数第二个)URI组件的

    • 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
      

      嗯,我不知道为什么失败了,但我可以说,我已经完全重新编写了脚本,现在它工作了。我必须指出,考虑到正在发生的错误,我也不知道为什么它现在能工作

      我使用完全相同的方法调用Get Content commandlet,使用-Encoding参数,使用自己的-Encoding参数调用pipe to Out文件。我所做的动作与之前版本的脚本完全相同。唯一明显不同的部分是执行已处理文件的FTP传输的部分。我现在只使用PowerShell来执行传输,而不是使用CuteFTP,而且一切似乎都正常工作

      感谢所有做出贡献的人

      干杯
      Norm

      -Path FilesA*.txt
      将在连续运行时包含Out文件
      FilesA_Digest.txt
      。作为旁白:将
      -Encoding ASCII
      应用于(最初)UTF-8编码数据可能会导致信息丢失:输入中超出ASCII范围的任何字符都将被音译为文字
      字符。(相比之下,如果原始数据仅包含ASCII范围字符,则根本不需要转码,因为UTF-8是ASCII的超集。)@LotPings——这是我的一个输入错误,因为我使用的是与原始脚本不匹配的虚拟文件名。原始脚本没有遇到这个问题。@mklelement0--我知道可能存在数据丢失问题,但事实是不会有,因为源文件不包含任何超出标准ASCII集的字符。@npowroz:我明白了,但这与您的说法“原始文件编码不正确”相矛盾:如果您可以使用
      -Encoding UTF8
      正确读取它们,并且它们只包含ASCII范围字符,那么您根本不需要任何转码。我尝试了您的所有建议,但仍然得到相同的错误,因此现在我真的不知所措。我知道我使用的是内置的Get内容,没有覆盖,没有定制,没有什么特别之处。这真的很奇怪。@npowroz:那么,如果您从一个PowerShell实例运行
      *.ps1
      脚本,该实例是您从
      -noprofile
      开始的,并且报告
      Microsoft.PowerShell.Management
      for
      (Get命令获取内容)。ModuleName
      您仍然会得到相同的错误吗?@npowroz:如果您执行
      Format Hex
      ,您的文件中是否存在任何不可见的控件字符?在使用-noprofile启动后,执行“获取命令获取内容”将返回“版本3.1.0.0/Source Microsoft.PowerShell.Management”。我使用十六进制格式转储了它,但我没有看到任何突出的东西。@npowroz:查看问题是否特定于具有给定PowerShell/OS版本的给定计算机。
      out文件
      不是问题,鉴于OP的错误消息明确指出
      Get Content
      是有问题的cmdlet:
      Get Content:找不到与参数名称“Encoding”匹配的参数。