首页 > 解决方案 > 术语“参数”未被识别为 cmdlet 的名称

问题描述

我有一个添加 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

出现的第一个错误是第一个错误

之后我把我的代码复制到新创建的文件中,它在另一个文件中工作

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

有人可以帮助解释它是什么以及它为什么会这样工作

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

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

谢谢!

标签: powershellactive-directory

解决方案


最可能的解释是您的脚本文件在行中包含不可见的控制字符param(...)特别是在单词之前、之后或内部param

使用Format-Hexcmdlet 检查您的文件中是否存在此类字符并将其删除

或者,使用此 GistDebug-String中提供的辅助函数,它可以更容易地发现异常字符,因为它按原样打印常规字符,同时将控制字符可视化为转义序列,例如识别不可见的零宽度空格字符,实例。`u{200b}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, ...

请注意,您无法从错误消息中分辨出零宽度空间的存在。

如果没有不可见的控制字符,表达式将不会产生输出(因为它会成功执行,并且参数声明块不会产生输出)。


推荐阅读