如何将一台计算机上的Powershell功能移动到另一台计算机上的脚本

时间:2013-12-04 15:55:57

标签: powershell-v3.0

我在我的管理员计算机上的配置文件中使用了一个函数,该函数调用另一个脚本作为查询特定计算机注册表以获取值的过程的一部分:

function Get-ISMServiceState ($computername = "$env:computername", $Service)  {
$registryPath = "HKLM:\SOFTWARE\....\ISM\Private\ApplicationData\$Service"
$State = (.\Get-RemoteRegistryKeyProperty $computername $registryPath State).State
Write-Host -foregroundcolor green "$Computername - $Service State is: $State"
}

此函数使用的 GetRe RemoteRegistryKeyProperty.ps1 脚本存储在我在命令行运行该函数的同一目录中,因此当我在命令行调用该函数时, 2个参数 sta9int2 SMGateway ,我得到了我期望的输出:

PS C:\Users\ingracarroll\Documents\Scripts> Get-ISMServiceState sta9int2 SMGateway
sta9int2 - SMGateway State is: 2

我已经使用了该函数并将其转换为脚本 Get-ISMServiceState.ps1 ,我已将其复制到另一台计算机并将 Get-RemoteRegistryKeyProperty.ps1 复制到同一目录。

param($computername, $Service)
$registryPath = "HKLM:\SOFTWARE\....\ISM\Private\ApplicationData\$Service"
$State = (.\Get-RemoteRegistryKeyProperty $computername $registryPath State).State
Write-Host -foregroundcolor green "$Computername - $Service State is: $State"

如果我从我的机器上运行这个脚本,我会得到预期的输出:

PS C:\Users\ingracarroll\Documents\Scripts> . \\sta9mon\c$\Data\Powershell\Get-ISMServiceState sta9int2 SMGateway
sta9int2 - SMGateway State is: 2

但如果我在目录中的另一台机器上运行相同的脚本,则两个脚本都存储在我的内容中,我得到以下内容:

PS C:\data\powershell>  .\Get-ISMServiceState sta9int2 SMGateway
You cannot call a method on a null-valued expression.
At C:\data\powershell\Get-RemoteRegistryKeyProperty.ps1:62 char:25
+ foreach($keyProperty in $key.GetValueNames())
+                         ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

You cannot call a method on a null-valued expression.
At C:\data\powershell\Get-RemoteRegistryKeyProperty.ps1:77 char:1
+ $key.Close()
+ ~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

sta9int2 - SMGateway State is:

所以看起来我在这台机器上运行的脚本没有正确执行以下行,即使它从我的其他机器远程运行时也是如此:

$State = (.\Get-RemoteRegistryKeyProperty $computername $registryPath State).State

我确信这只是我做了一些基本错误的事情,但我看不出它是什么。

有人可以指出我的方式错误吗?

1 个答案:

答案 0 :(得分:0)

好的,在继续调查我的问题后,我发现脚本失败的主要原因是它试图查询注册表项。

这是由于平台不同,我的管理员机器是32位Windows 7平台,我需要运行此脚本的机器是64位Windows Server 2008 R2平台。

在32位机器上,下面的代码可以正常读取已识别的注册表项:

$registryPath = "HKLM:\SOFTWARE\....\ISM\Private\ApplicationData\$Service"

从32位平台运行我可以阅读32位或64位平台的注册表。

在64位计算机上,需要更改代码以包含Wow6432Node部分,以便在64位平台上读取相同的注册表项:

$registryPath = "HKLM:\SOFTWARE\Wow6432Node\....\ISM\Private\ApplicationData\$Service"

此外,我将对外部脚本的调用更改为:

$State = (. c:\data\powershell\Get-RemoteRegistryKeyProperty $computername $registryPath State).State

这样可以在使用以下参数启动时通过批处理脚本运行:

PowerShell.exe -NonInteractive -NoProfile -file "Get-ISMServiceState.ps1" %1 %2

希望这可能有助于一些可能在任何类似情况下苦苦挣扎的人。