运行功能错误

时间:2014-10-20 16:23:30

标签: powershell scripting

运行以下功能时出现以下错误:

  

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 
}

你对我做错了什么有任何想法吗?

2 个答案:

答案 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