术语“param”未被识别为 cmdlet 的名称

问题描述 投票:0回答:2

我有一个添加 AD 组的脚本。 有一段时间,它工作正常,然后停止工作,出现奇怪的错误

param($name, $path)

$username = 'tst\user-ad'
$encryptedStringPwd = Get-Content C:\Scripts\pwd\DNSpwd.txt
$password = ConvertTo-SecureString $encryptedStringPwd
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $password 

Invoke-Command -ComputerName . -ScriptBlock {
    New-ADGroup `
        -Name $Using:name `
        -SamAccountName $Using:name `
        -GroupScope Global `
        -Path $Using:path `
        -GroupCategory Security
} -authentication credssp -credential $cred

出现的第一个错误是first error

之后,我将代码复制到新创建的文件中,它就工作了work in another file

之后我删除了原来的不起作用的脚本并创建了相同的脚本,该脚本一开始不起作用,启动几次后,它起作用了,但同时继续写错误work/error

有人可以帮忙解释一下它是什么以及为什么它会这样工作吗

我将再次重复一遍,在此之前一切正常,并且我确信脚本没有进行任何更改

我的解决方法是,我将 test.ps1 文件重命名为我需要的名称,并删除了非工作文件,之后一切都对我有用,而我没有更改文件的内容

谢谢!

powershell active-directory
2个回答
1
投票

最可能的解释是您的脚本文件在param(...)

上包含
不可见的控制字符,特别是在单词
param
之前、之后或内部。

使用

Format-Hex
cmdlet 检查文件中是否存在此类字符并删除它们

或者,使用辅助函数

Debug-String
(可从 this Gist 获得),这可以更轻松地发现异常字符,因为它按原样打印常规字符,同时将控制字符可视化为 转义序列,例如
`u{200b}
识别不可见的 ZERO WIDTH SPACE 字符,例如
U+200B

Invoke-Expression

 的帮助下使用这个特定的不可见控制字符来演示问题(但是通常应该避免)。

PS> Invoke-Expression ('{0}param($name, $path)' -f [char] 0x200b) param: The term 'param' is not recognized as a name of a cmdlet, function, script file, ...
请注意,您无法从错误消息中判断是否存在零宽度空格。

如果没有不可见的控制字符,表达式将导致

无输出(因为它将成功执行,并且参数声明块不会产生输出)。


0
投票
对于未来遇到此错误的人:

这个无用的错误消息就发生在我身上 - 结果是,我添加到另一个引用的脚本中的“helper”函数还在其文件顶部包含了一个 param 关键字,但我没有注意到。

File A -> Helper Library B
检查顶层是否没有 param 关键字的依赖项:在我的例子中,Helper Library B 意外地包含了一个 param 部分,这需要相当长的时间才能解决!

© www.soinside.com 2019 - 2024. All rights reserved.