调用命令并使用参数运行 ps1

2024-03-06

我正在尝试使用 invoke-command 运行脚本来安装端点防御程序以及一些相关参数。

如果我使用 invoke-command 运行标准 ps1,它可以正常工作。但是,如果我运行以下命令:

Invoke-Command -ComputerName NAME -FilePath \\srv\share\install.ps1 -OnboardingScript \\srv\share\WindowsDefenderATPonboardingscript.cmd -Passive

我收到“找不到与参数名称“OnboardingScript”匹配的参数”。有人可以帮助我了解如何调用命令并运行带参数的脚本吗?

install.Ps1 文件中已定义参数

https://github.com/microsoft/mdefordownlevelserver/blob/main/Install.ps1 https://github.com/microsoft/mdefordownlevelserver/blob/main/Install.ps1


Your Invoke-Command https://learn.microsoft.com/powershell/module/microsoft.powershell.core/invoke-command呼叫有一个语法问题, as 圣地亚哥·斯夸松 https://stackoverflow.com/users/15339544/santiago-squarzon指出:

Any 直通论点- 路径被传递到的脚本可以看到的那些-FilePath - 必须通过指定-ArgumentList (-Args) 参数,作为array.

# Simplified example with - of necessity - *positional* arguments only.
# See below.
Invoke-Command -ComputerName NAME -FilePath .\foo.ps1 -Args 'bar', 'another arg'

The 同样适用到使用脚本块的更常见的调用形式({ ... }),通过(可能位置隐含)-ScriptBlock范围.

然而,有一个问题:Only 位置性的参数可以这样传递, which:

  • (a) 要求目标脚本支持所有感兴趣的参数的位置参数绑定...

  • (b) ...这明显阻止了通过switch参数(类型[switch]), 例如-Passive在你的通话中。

  • (c) 要求您以正确的顺序传递不变的位置参数。


解决方法:

Use a -ScriptBlock基于调用,它允许常规参数传递并支持通常的named参数(包括开关):

  • 如果像您的情况一样,脚本文件是也可通过远程会话可见的 UNC 路径访问,你可以简单地调用它从远程脚本块内部.
  • 注意:您的情况不需要,但您通常可能需要$using:参考 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_scopes#the-using-scope-modifier为了合并来自的值local会话到参数中 - 请参阅下面的示例。
Invoke-Command -ComputerName NAME {
  & \\srv\share\install.ps1 -OnboardingScript \\srv\share\WindowsDefenderATPonboardingscript.cmd -Passive
} 
  • 否则(通常,一个脚本文件对于调用者来说是本地的):

Use a $using:参考通过content将脚本文件(源代码)发送到远程会话,将其解析为脚本块,然后使用感兴趣的参数执行该脚本块:

$scriptContent = Get-Content -Raw \\srv\share\install.ps1
Invoke-Command -ComputerName NAME {
  & ([scriptblock]::Create($using:scriptContent)) -OnboardingScript \\srv\share\WindowsDefenderATPonboardingscript.cmd -Passive
} 

小警告:由于执行了原始脚本文件的源代码在记忆中在远程会话中,file- 相关的反射信息将不可用,例如报告脚本文件的完整路径和目录路径的自动变量($PSCommandPath and $PSScriptRoot).

也就是说,这同样适用于使用-FilePath参数,它本质上使用相同的技术,在幕后将源代码而不是文件复制到远程会话。

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

调用命令并使用参数运行 ps1 的相关文章

  • 脚本块上的新闭包

    考虑这段代码 PS gt timer New Object Timers Timer PS gt timer Interval 1000 PS gt i 1 PS gt Register ObjectEvent timer Elapsed
  • 在powershell中,在启动进程中设置亲和力

    在 powershell 中 我可以启动一个进程 app name app exe app arguments arg0 Start Process app name app arguments 我尝试设置亲和力 app Start Pro
  • 具有多个范围的 Powershell 整数参数验证

    我知道您可以声明一个仅接受特定范围内的值的整数参数 Parameter ValidateRange 1024 66535 Port 是否可以验证多个范围的参数输入 例如 假设我希望允许端口输入为 1 到 80 135 到 445 以及 10
  • 使用 init.ps1 和 nuget 将文件复制到解决方案文件夹

    我在使用 nuget 包的 init ps1 中的 ps 脚本时遇到问题 我试图在安装包时创建一个解决方案文件夹 然后将 dll pdbs 复制到此文件夹 并删除项目中包安装的源 dll pdbs 我能够创建解决方案文件夹 但将文件从 co
  • EWS - 访问共享日历项目/约会

    我正在尝试获取共享日历的所有项目 我已关注EWS 访问所有共享日历 https stackoverflow com questions 23766747 ews access all shared calendars 23773834 23
  • 当存在另一个参数时在 PowerShell 中需要参数

    到目前为止我读到的所有内容都告诉我这应该有效 这是一个用于自动从 AD 帐户转出的脚本 我希望它的工作方式是 如果设置了 TransferHomeDrive 开关 那么它将需要旧服务器和新服务器的名称 我相信我应该能够通过参数集来做到这一点
  • 使用 PEM 证书验证 Powershell 中的 XML 签名

    我正在尝试创建一个 powershell 脚本来使用 XML 文档中的数据 然而 在进行任何工作之前 我需要通过验证签名来验证 XML 没有被篡改 我有一份用于以 PEM 格式签署 XML 的证书的公钥副本 但我不知道如何让 powersh
  • 如何使用PowerShell批量调用Update-Database

    我们使用 Azure 弹性池生成多个客户端数据库和一个引用客户端数据库的主数据库 我们已经拥有多个数据库 并且正在开发新版本的代码 我们使用 EF6 代码优先 当我们更改模型 添加属性 时 我们创建迁移文件并需要调用Update Datab
  • Docker 在 Powershell 中登录 gcr.io

    我正在尝试使用 Windows 10 登录 Google 容器注册表JSON 密钥文件 https cloud google com container registry docs advanced authentication using
  • 更改每个命令的 powershell 标题

    我想在窗口标题中显示我在 powershell 中输入的最后一个命令 以便更容易找到 目前我有 C gt host ui rawui WindowTitle 但这只是获取相对于我输入时的上一个命令 所以如果我有 C gt cd C gt h
  • 将组“Everyone”添加到目录及其所有子目录

    我目前使用的是 Vista 32 位 如何添加 Windows 安全组 Everyone 并完全控制目录及其所有子目录和所有文件 有我可以使用的 powershell 脚本吗 Thanks 我已经扩展了 martona 的代码片段 并且能够
  • 如何根据事件触发SSRS订阅?

    有没有一种方法可以让我在共享文件夹中创建文件等事件时触发 SSRS 订阅 基于时间 我们可以使用 powershell 或 C 来实现吗 SSRS 中是否有可用的开箱即用功能 尽管我认为没有 我正在使用 SQL Server 2008 R2
  • 如何在 PowerShell 中获取当前活动/前台窗口

    我知道这可以通过使用 alt tab 轻松完成 但创建此脚本的主要目的是自学一些 PowerShell 基础知识 我正在编写一个脚本 运行时会在 powershell 和当前前台窗口之间切换前台窗口 我读这个问题 https stackov
  • 与 PowerShell CmdLets 互操作

    我一直在编写一些利用 App V 的 PowerShell Cmdlet 的实用程序 有趣的是 微软似乎只记录了 cmdlet 而不记录 Powershell 模块背后使用的 net 程序集 现在 我熟悉了 P Invoke 和 COM I
  • 在 DownloadProgressChanged 事件期间从 DownloadFileAsync 对事件处理程序的更新缓慢

    我的问题 我正在编写一个 PowerShell 脚本 在继续执行其他任务之前 该脚本需要从远程 Web 服务器下载几个大文件 我的项目要求之一是显示每次下载的进度 以便最终用户知道发生了什么 对另一个 SO 问题的回复包含一个使用注册事件和
  • Windows 计算机上出现“来自守护程序的错误响应:无法创建填充程序:OCI 运行时创建失败”错误

    我正在尝试构建一个简单的 Python 映像 然后在 Windows 上以交互方式访问容器 构建过程有效 但运行容器失败 这是 Dockerfile FROM python 3 10 4 WORKDIR app 生成文件 IMAGE scr
  • Powershell:如何获取从 PsJob 内运行的进程返回的退出代码?

    我在 powershell 中有以下工作 job start job c utils MyToolReturningSomeExitCode cmd ArgumentList JobFile 如何访问返回的退出代码c utils MyToo
  • 获取对 SOAP 的 XML 响应中的节点值

    我在 PowerShell 中发出 SOAP 请求 如下所示 uri https secure echosign com services EchoSignDocumentService20 WSDL sun Invoke WebReque
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • 启动 psexec 后获取进程 ID

    我有一个使用 psexec 在远程计算机上调用记事本的脚本 有什么办法可以在启动后获取进程ID吗 这是我所拥有的 PCname MyPC SessionID 2 Program Notepad exe FilePath C temp Fil

随机推荐