我有一个添加 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 文件重命名为我需要的名称,并删除了非工作文件,之后一切都对我有用,而我没有更改文件的内容
谢谢!
最可能的解释是您的脚本文件在param(...)
行
上包含不可见的控制字符,特别是在单词
param
之前、之后或内部。
Format-Hex
cmdlet 检查文件中是否存在此类字符并删除它们。
或者,使用辅助函数
Debug-String
(可从 this Gist 获得),这可以更轻松地发现异常字符,因为它按原样打印常规字符,同时将控制字符可视化为 转义序列,例如 `u{200b}
识别不可见的 ZERO WIDTH SPACE 字符,例如 U+200B
。
的帮助下使用这个特定的不可见控制字符来演示问题(但是通常应该避免)。
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, ...
请注意,您无法从错误消息中判断是否存在零宽度空格。如果没有不可见的控制字符,表达式将导致
无输出(因为它将成功执行,并且参数声明块不会产生输出)。
这个无用的错误消息就发生在我身上 - 结果是,我添加到另一个引用的脚本中的“helper”函数还在其文件顶部包含了一个 param 关键字,但我没有注意到。
File A -> Helper Library B
检查顶层是否没有 param 关键字的依赖项:在我的例子中,Helper Library B 意外地包含了一个 param 部分,这需要相当长的时间才能解决!