使用通用参数执行远程通用 Powershell 脚本

2023-12-10

我需要编写一个 Powershell 脚本(我们称之为“控制器脚本”),它能够调用传递通用参数的通用远程 Powershell 脚本。 控制器脚本接受主机名、凭据、远程脚本路径和远程脚本参数(作为哈希表)作为参数。

相反,远程脚本可以是接受任何字符串参数的任何脚本。

对控制器脚本使用哈希表参数很有用,因为我可以传递参数的动态字典(取决于控制器调用),同时使 PS 执行将字典“转换”为字符串参数列表的工作,例如-Param1 Value1 -Param2 Value2.

我得到了一些想法this答案,这就是我所做的(“控制器”脚本):

Param(
  [string] $ComputerName,
  [string] $Username,
  [string] $Password,
  [string] $ScriptPath,
  [string] $Parameters
)
$EncPassword = ConvertTo-SecureString $Password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($Username,$EncPassword)

$ScriptBlock = [Scriptblock]::Create(".$ScriptPath $(&{$args} @Parameters)")

Invoke-Command -ComputerName $ComputerName -Credential $cred -Scriptblock $ScriptBlock

然后我通过 PS 提示符执行它:

.\controller.ps1 -ComputerName MACHINE_NAME -Username USERNAME -Password PASSWORD -ScriptPath "D:\TestScript.ps1" -Parameters @{AParameter = "asd"}

执行失败并出现以下错误:

术语“.D:\TestScript.ps1”未被识别为 cmdlet、函数、脚本文件或可操作程序。检查拼写 名称,或者如果包含路径,请验证该路径是否为 正确并重试。

所以看来Scriptblock指本地脚本(在控制器的计算机上),而不是指目标脚本所在的远程计算机。

有没有办法让我使用 hashtable 参数执行远程 PS 脚本,这是所需的灵活性要求?

UPDATE 1

我在点和点之间添加了一个空格$ScriptPath变量在ScriptBlock定义但错误是相同的(没有点)。

$ScriptBlock = [Scriptblock]::Create(". $ScriptPath $(&{$args} @Parameters)")

术语“D:\TestScript.ps1”未被识别为 cmdlet、函数、脚本文件或可操作程序。检查拼写 名称,或者如果包含路径,请验证该路径是否为 正确并重试。

UPDATE 2

我找到了一种无需参数即可调用远程脚本的方法。

Param(
  [string] $ComputerName,
  [string] $Username,
  [string] $Password,
  [string] $ScriptPath,
  [hashtable] $Parameters
)
$EncPassword = ConvertTo-SecureString $Password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($Username,$EncPassword )

Invoke-Command -ComputerName $computerName -Credential $cred -ScriptBlock {Invoke-Expression $args[0]} -ArgumentList $ScriptPath

我得到不带参数的远程脚本输出。现在剩下要做的就是散列表$Parameters远程调用远程路径中的脚本时$ScriptPath。你有什么主意吗?我做了一些尝试,但没有任何效果。


我终于找到了解决方案

控制器.ps1

Param(
  [string] $ComputerName,
  [string] $Username,
  [string] $Password,
  [string] $ScriptPath,
  [hashtable] $Parameters
)
$EncPassword = ConvertTo-SecureString $Password -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($Username,$EncPassword )

Invoke-Command -ComputerName $computerName -Credential $cred -ScriptBlock {
  $params = $Using:Parameters
  Invoke-Expression "$Using:ScriptPath @params"
}

正如你在这里看到的,我们使用$Using变量在ScriptBlock检索外部变量($ScriptPath and $Parameters)然后我们调用远程脚本来绘制参数哈希表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用通用参数执行远程通用 Powershell 脚本 的相关文章

随机推荐

  • Spring验证返回很长的错误消息,而不仅仅是自定义的消息

    Spring验证返回很长的错误消息而不是自定义的一次 这是 dto 中的代码部分 public class RequestDto implements Serializable NotNull message id required pri
  • IE 11 的模板标签 polyfill - 不适用于表 tr 和 td

    我使用polyfill js 它允许处理不支持它的浏览器的标签 上的polyfill源代码jsfiddle Source question 但我注意到 在 IE 11 中 这个 polyfill 无法与包含以下内容的模板一起使用 tr an
  • 使用 Visual Studio 2010 和 HG 进行版本控制

    最近 我和我的团队获得了一个用于版本控制的 HG 存储库 因为这将使我们的应用程序开发变得更容易 更好 我们使用 Visual Studio 2010 和 c 所有项目都处于版本控制之下 不幸的是 当我们其中一个人提交时 另一个人在打开解决
  • 正则表达式在所有标点符号之间添加空格

    我需要在字符串中的所有标点符号之间添加空格 Hello World gt Hello World It s 9 00 gt It s 9 00 1 B 3 D gt 1 B 3 D 我认为正则表达式是正确的方法 可以匹配所有非标点符号 a
  • Spark 中的倾斜

    我有一个数据集 我想按特定键 clientID 进行分区 但某些客户端产生的数据比其他客户端多得多 Hive 中有一个功能称为 列表分桶 由 调用倾斜于 专门针对这种情况 但是 我找不到任何迹象表明 Spark 支持此功能 或者如何 如果支
  • Android 开发 - 转换为 Dalvik 格式失败,错误 1

    所以我第一次涉足这个领域 我按照说明安装了 android SDK 和 eclipse 插件 我创建了一个空白的新 android 项目 但出现以下构建错误 2011 01 08 16 34 55 xxx Dxno classfiles s
  • Maximo 公式可以返回 null 吗?

    在 Maximo 7 6 1 1 中 我在持久字段上有一个属性公式 称为WORKORDER X 字段类型为十进制 长度为18 小数位为10 该公式的目的是做到这一点 如果 WOSERVICEADDRESS LONGITUDEX 不为空 则使
  • Java中System.out.println的含义是什么?

    这是静态的吗println函数于out班级来自System命名空间 namespace System class out static println 我该如何解释这个名字 这个函数在 JRE 中的什么地方定义的 在java lang Sy
  • 在 groovy 脚本中从 ant - sshexec 获得格式良好的输出

    我的问题是 ant 任务的输出总是在开头有一些 ssh exec 信息文本 我可以抑制 禁用它吗 到目前为止我的代码 def ant new AntBuilder variable definition ant sshexec host h
  • OS X 上的 Matplotlib 问题(“ImportError:无法导入名称 _thread”)

    在过去几天的某个时候 Matplotlib 停止在 OS X 上为我工作 这是我尝试时遇到的错误import matplotlib Traceback most recent call last File my path to script
  • “dotnet Restore”失败,并显示“SSL 对等证书或 SSH 远程密钥不正常”

    我刚刚按照这里的程序进行操作 https www microsoft com net core ubuntu 这就是输出dotnet restore log Restoring packages for home test project
  • 使用 Django 的 ORM 的模型继承方法

    我想将事件存储在我正在闲逛的 Web 应用程序中 并且我非常不确定每种方法的优缺点 广泛使用继承或以更温和的方式使用继承 Example class Event models Model moment models DateTimeFiel
  • 如何安装肥皂扩展?

    如何安装肥皂 我收到这个错误 致命错误 在第 16 行 home user mysite com path to file php 中找不到类 SoapClient 我在 DreamHost 中托管我的网站 他们不支持任何第三方安装 UPD
  • 如何连接 Web API Castle Windsor DI 代码的各个部分?

    如何连接 Web API Castle Windsor DI 代码的各个部分 以便控制器的路由选择正确的接口实现 Note 经过几次错误的开始 死胡同和部分胜利 here and here and here 我将尽快给予最大的赏金500点
  • 设置从包含注释的 json 加载的对象的属性值

    当从 json 文件加载对象时 通常可以设置属性值并将文件写回 如下所示 manifest gc manifestPath ConvertFrom Json AsHashtable manifest name manifest name s
  • 在 DatePIcker 中设置 MinDate 和 MaxDate

    创建应用程序 其中我显示 DatePicker 现在我想设置 DatePicker 的 MinDate 是前两年 最大日期仅是未来两年 选择应基于当前日期 假设当前日期是 23 11 2016 因此 datepicker 应显示日期直到 2
  • iPhone 无法通过 WiFi 连接到本地 HTTP 服务器

    使用以下命令时 我无法打开在 iPhone 6s iOS 9 2 中的 MacBook 上运行的 HTTP 服务器提供的静态 HTML 页面 无论是在 Safari 还是 Chrome 浏览器中 http ipNumberOfMyServe
  • PHP 禁用输出缓冲

    我已经关掉了输出缓冲在 PHP 中通过设置output buffering off在 php int 中 但是当运行这样的简单代码时
  • 二维数组传递给函数

    我一直在读这个question但我无法获得解决问题的结果代码 我应该如何改变它才能使其发挥作用 void print2 int array int n int m main int array 4 1 2 3 4 5 6 7 8 int a
  • 使用通用参数执行远程通用 Powershell 脚本

    我需要编写一个 Powershell 脚本 我们称之为 控制器脚本 它能够调用传递通用参数的通用远程 Powershell 脚本 控制器脚本接受主机名 凭据 远程脚本路径和远程脚本参数 作为哈希表 作为参数 相反 远程脚本可以是接受任何字符