【发布时间】:2020-01-27 06:31:08
【问题描述】:
我正在尝试创建一个类对象并使用Invoke-Command 在远程机器上调用该类的函数。当我使用没有计算机名称的Invoke-Command 时,这可以正常工作,但是当我尝试在远程计算机上执行此操作时,我收到一个错误,指出该类型不包含我的方法。这是我用来测试的脚本。
$ComputerName = "<computer name>"
[TestClass]$obj = [TestClass]::new("1", "2")
Get-Member -InputObject $obj
$credentials = Get-Credential
Invoke-Command -ComputerName $ComputerName -Credential $credentials -Authentication Credssp -ArgumentList ([TestClass]$obj) -ScriptBlock {
$obj = $args[0]
Get-Member -InputObject $obj
$obj.DoWork()
$obj.String3
}
class TestClass {
[string]$String1
[string]$String2
[string]$String3
[void]DoWork(){
$this.String3 = $this.String1 + $this.String2
}
TestClass([string]$string1, [string]$string2) {
$this.String1 = $string1
$this.String2 = $string2
}
}
这是我得到的输出。
PS > .\Test-Command.ps1
cmdlet Get-Credential at command pipeline position 1
Supply values for the following parameters:
User: <my user>
Password for user <my user>: *
TypeName: TestClass
Name MemberType Definition
---- ---------- ----------
DoWork Method void DoWork()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
String1 Property string String1 {get;set;}
String2 Property string String2 {get;set;}
String3 Property string String3 {get;set;}
TypeName: Deserialized.TestClass
Name MemberType Definition
---- ---------- ----------
GetType Method type GetType()
ToString Method string ToString(), string ToString(string format, System.IFormatProvider formatProvider), string IFormattable.ToString(string format, System.IFormatProvider formatProvider)
String1 Property System.String {get;set;}
String2 Property System.String {get;set;}
String3 Property {get;set;}
Method invocation failed because [Deserialized.TestClass] does not contain a method named 'DoWork'.
+ CategoryInfo : InvalidOperation: (DoWork:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
+ PSComputerName : <computer name>
我可以看到类型从TestClass 变为Deserialized.TestClass,我想知道是否有办法解决这个问题?我的目标是能够将我需要的功能运送到我正在运行脚本的每台机器上,这样我就不必在 Invoke-Command 脚本块的上下文中重写这些功能。
【问题讨论】:
-
只需在脚本块中包含类定义并将构造函数参数作为参数传递。由于 2 台计算机不共享内存,它们只能与序列化(键/值对)对象进行交换
标签: powershell serialization invoke-command