运行以下功能时出现以下错误:
Invoke-Command:无法验证参数'ComputerName'的参数。 参数为null或空。提供非null或的参数 为空,然后再次尝试该命令。在 C:\ Users \ usernameone \ Desktop \ script.ps1:16 char:29 + Invoke-Command -ComputerName<<<< $ _ -ScriptBlock $ s -Credential $ cred + CategoryInfo:InvalidData :( :) [Invoke-Command],ParameterBindingValidationException + FullyQualifiedErrorId:ParameterArgumentValidationError,Microsoft.PowerShell.Commands.InvokeCommandCommand
$username = "username"
$password = "password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
$_="192.168.10.4"
function test{
$s = $ExecutionContext.InvokeCommand.NewScriptBlock("mkdir C:\'Documents and Settings'\username\Desktop\Testfolder")
Invoke-Command -ComputerName $_ -ScriptBlock $s -Credential $cred
}
你对我做错了什么有任何想法吗?
答案 0 :(得分:1)
只有当包含它的函数或scriptblock包含在活动管道中时,才会填充特殊变量$_
。如果您像这样调用test
,它应该可以工作:
PS> "computername" | test
请?
顺便说一下,为什么要以那种尴尬的方式创建一个脚本块呢?使用文字语法:
$s = { mkdir 'c:\...\blah' }
如果您想以编程方式从文本创建脚本块,可以采用更简单的方法:
$s = [scriptblock]::create('...')
如果不希望引用要解析的变量 >> 解析了scriptblock,请不要忘记使用单引号。
答案 1 :(得分:0)
重命名变量$_
,它将有效......
<强>解释强>
$_
对于迭代中的当前值是“保留的”,例如foreach
或管道。见这里:What does $_ mean in PowerShell?
如果你把你的功能称为@ x0n说,那么它就有意义了。如果希望函数每次在同一台机器上创建文件夹,则不要使用变量。但是,如果您希望您的函数在不同的计算机上创建该文件夹,您的函数应该知道您希望该文件夹在哪台计算机上。这通常是通过函数参数完成的。
[...]
$ipaddress = "192.168.10.4";
function test([string]$ip, [System.Management.Automation.PSCredential]$credentials) {
$s = $ExecutionContext.InvokeCommand.NewScriptBlock("mkdir C:\'Documents and Settings'\username\Desktop\Testfolder");
Invoke-Command -ComputerName $ip -ScriptBlock $s -Credential $credentials;
}
// then call it like this
test $ipaddress $cred;
以下是所有这些保留内容的列表:http://www.neolisk.com/techblog/powershell-specialcharactersandtokens