从批处理文件调用脚本时如何指定开关参数

2024-04-23

我有一个脚本foo.ps1和一个批处理文件foo.cmd用于通过双击文件资源管理器中的 cmd 文件来启动脚本。

该脚本接受一个开关参数,但我不知道如何提供这种参数。简单的参数就可以了。

Foo.ps1:

param(
    [Parameter()]
    [Switch]$MySwitch,
    [Parameter()]
    [string]$Name
)

Write-Host "`$MySwitch : $MySwitch, `$Name : $name"

Foo.cmd:

Powershell -noprofile -NonInteractive -file "%~dp0\foo.ps1" -Name "abc"    

如果我仅使用“名称”调用脚本,它就会起作用。但如果我指定 MySwitch,它就会停止工作:

Foo2.cmd:

Powershell -noprofile -NonInteractive -File "%~dp0\foo.ps1" -Name "abc" -MySwitch:$false

错误是:

C:\temp\foo.ps1 : Impossible de traiter la transformation d'argument sur le paramètre «MySwitch». Impossible de convertir la valeur «System.String» en type « System.Management.Automation.SwitchParameter». Les paramètres booléens acceptent seulement des valeurs booléennes et des nombres, tels que $True, $False, 1 ou 0.
    + CategoryInfo          : InvalidData : (:) [foo.ps1], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,foo.ps1

In Windows PowerShell, there is no way to pass Boolean values when powershell.exe https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_powershell_exe's
-File parameter is used
- this has has since been corrected in PowerShell (Core) 7+ https://github.com/PowerShell/PowerShell/blob/master/README.md, whose CLI is pwsh.exe https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_pwsh[1].

Use the 解决方法 that JosefZ https://stackoverflow.com/users/3439404/josefz推荐:

Use of -Command (-c)代替-File 使 PowerShell 将参数视为PowerShell 源代码而不是字面上的论证, 在这种情况下$false被正确识别(为简洁起见,省略了其他 CLI 参数)。

powershell -c "& \"%~dp0\foo.ps1\" -Name 'abc' -MySwitch:$false"  

Note:

  • &, the 呼叫接线员 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Operators#call-operator-,必须用来调用脚本文件,因为它的路径是quoted.

  • PowerShell 需要嵌入"字符。在命令行上转义为\"(不作为`" or "",它的工作方式inside电源外壳)。

    • With -Command,如果您需要逐字嵌入" 在嵌入的内部\"...\" string, use `\" (sic).
    • 虽然您可以将脚本路径括起来'...'相反,为了避免转义的需要,如果扩展的目录文件路径(%dp0) 恰好包含'字符。本身。
  • 有关何时使用的一般指导-File vs. -Command以及适用的不同语法规则,请参阅这个答案 https://stackoverflow.com/a/57443822/45375.


在概念上:

  • 您的代码已经使用了在 PowerShell 中传递布尔参数的首选方法:[switch] https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Functions#switch-parameters参数(有时称为flags).

  • 开关参数imply布尔值:如果指定了给定开关(仅按名称)(-MySwitch), $true是暗示的;如果是完全缺席, $false是暗示的。那是,simply omitting -MySwitch:$false也会解决你的问题.

    • 相比之下,[bool]- 类型参数 - 总是require争论——应该避免。这个帖子 https://stackoverflow.com/q/49130184/45375对比[bool] with [switch]参数。
  • 当(PowerShell-内部)你(总是)can通过explicit value(正如你尝试的那样
    -MySwitch:$false,注意必需的:分隔器, a space不会工作) - 这样做是only required在以下场景中:

    • 如果您想传递布尔值通过变量其价值已确定以编程方式.

    • 在极少数情况下,开关默认为$true,并且您需要覆盖它。

      • 出于概念上的原因,默认开关参数为$true最好避免在用户代码中:如有必要,否定开关的逻辑;一个例子是Write-Host's -NoNewLine switch.

      • 然而,PowerShell 的一些常用参数 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_CommonParameters是开关参数,可以有效默认为$true通过他们的偏好变量 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Preference_Variables同行。

        • 一个值得注意的例子是常见的-Confirm开关参数 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_CommonParameters#-confirm:对应的值$ConfirmPreference偏好变量 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Preference_Variables#confirmpreference可以使其必须通过-Confirm:$false为了选择退出确认提示,即使$ConfirmPreference的默认值(High).

[1] PowerShell (Core) 7+ supports the following Boolean values when -File is used: $true, $false, true, false (and also $null, but its interpretation differs: scripts (including with -File) and functions interpret it as $false, whereas cmdlets interpret it as $true(!)).
Note that with -Command - and therefore in all PowerShell code - true and false do not work, but 0 and 1 do.
Unfortunately, if you pass an unsupported value, you get the same error message in all scenarios, which in the -File scenario misleadingly suggests that 0 and 1 work too.

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

从批处理文件调用脚本时如何指定开关参数 的相关文章

随机推荐

  • Jsoup 解析和嵌套标签

    我正在学习 Jsoup 并有这个 HTML p Content p p Content p p Content p 我使用 Jsoup parse 和文档 select p 来捕获 内容 并且效果很好 但 p Content p p Con
  • Python向图像添加额外区域

    所以我有一张包含图像尺寸的表格 有多个不同尺寸的图像 66x66 400x400 等 我有一个图像示例 原始图像 其尺寸始终为 600x532 该图像上是一种产品 电视 PC 等 我必须调整该图像的大小 这不是问题 但如果我按照比例这样做
  • Linux bash 中波浪号的含义(不是主目录)

    首先 我知道 是主目录 CD 至 or 带我到主目录 然而 cd X带我去一个特别的地方 在那里X似乎是什么 在 bash 中 如果我点击 cd 然后点击选项卡 它会显示一堆可能的 X选项如 mail and postgres and ss
  • 如何计算r中两年的移动平均值

    我有一个关于并购 M As 的大数据框 900k 行 df 有四列 date 并购完成时 目标国家 被合并 收购的国家的公司 收购方 国家 收购方是哪个国家的公司 以及big corp 无论收购方是否是大公司 其中 TRUE 表示该公司很大
  • SQL:链接连接效率

    我的 WordPress 插件中有一个查询 如下所示 SELECT users U meta value AS first name M meta value AS last name FROM nwp users AS users LEF
  • 什么时候使用扩展方法,ext.方法与继承?

    我们开始使用 C NET 3 0 我想知道你们是如何使用扩展方法的 你什么时候使用它们 另外 如果您还列出使用它们的所有黑暗先决条件 我将不胜感激 使用扩展方法的次数 当你不控制扩展的类型时 您不想强迫实现者提供可以使用现有方法完成的代码
  • Inappbrowser回调

    我尝试使用 inappbrowser 登录 facebook 后回拨 但它无法检查电子邮件 姓名等 这是我的代码 Inapp浏览器调用 function onDeviceReady var my client id FBkey my red
  • 在文本文件上书写时,重音符号和特殊字符无法正确显示

    这就是我正在做的事情 我在网站上进行网络爬虫以供个人使用 以复制文本并将书籍的章节设置为文本格式 然后使用另一个程序将其自动转换为 pdf 以将其放入我的云中 一切都很好 直到发生这种情况 特殊字符无法正确复制 例如重音在文本文件上显示为
  • 自旋锁在单处理器单核架构中有用吗?

    我对自旋锁的功能感到困惑 自旋锁用于阻止进程重新调度 然而 在只有一个核心的机器上 使用自旋锁有用吗 防止上下文切换 您的观察结果很好 在单处理器系统上 旋转等待资源是没有意义的 因为您最好尽早切换线程 互斥体和信号量正是这样做的 在多处理
  • 如何使用 Laravel 4 Eloquent 连接列?

    我有一张桌子叫tenantdetails其中包含 Tenant Id First Name Last Name 我想找回First Name and Last Name通过 MySQL 的串联功能作为一列 所以我写在我的controller
  • java.lang.IllegalArgumentException:未找到属性类的 Setter

    我想实现一个带有行编辑的表格 I found 在展示柜中 但我每次都会收到此错误 javax servlet ServletException 找不到属性类的 Setter java lang IllegalArgumentExceptio
  • 如何使用代码“约定”映射来忽略属性映射

    有什么方法可以避免使用 NHibernate 3 2 使用代码约定映射来映射属性吗 默认情况下 所有属性都会被映射 2 作为复制粘贴 IsPersistent 属性默认实现的替代方案 它可以通过反射重用 var mapper new Con
  • 如何对重新采样的音频数据进行双三次(或其他非线性)插值?

    我正在编写一些以不同速度播放 WAV 文件的代码 以便波形要么更慢 音调更低 要么更快 音调更高 我目前正在使用简单的线性插值 如下所示 int newlength int Math Round rawdata Length lengthM
  • PHP NuSoap 中的复杂类型

    我正在使用 PHP 中的 NuSoap 库构建一个 Web 服务 我的 Web 服务将充当客户端和供应商现有的 Web 服务之间的中间层 因此 客户端不是直接连接到供应商 而是连接到我的 Web 服务 我的 Web 服务连接到供应商并获取响
  • 在自己的构造函数中调用 thread.start() [重复]

    这个问题在这里已经有答案了 线程在自己的构造函数中调用 this start 是否合法 如果是的话 这会导致什么潜在问题 我知道在构造函数运行完成之前该对象不会完全初始化 但除此之外还有其他问题吗 出于内存安全的原因 您不应从其构造函数内向
  • VS2008 jQuery Intellisense 不工作 - (jquery-1.4.1.js)

    我在谷歌上搜索过 遵循 scottguthrie 的文章 也在此处寻找解决方案 但无济于事 我的环境由 VS2008 SP1 组成 包括 JQuery intellisense 的修补程序 我已经从 jquery 网站下载了 jquery
  • GestureDetector.onTouchEvent 中的 NullPointerException

    我有一个在 onTouch 中使用 GestureDetector 的活动 在我的布局中 我还有一个实现 onClickListener 的视图 在 Android ICS 上 我在处理 TouchEvent 时收到 NullPointer
  • 在 Swift 中使用 Container View 进行委托

    我正在为 iPad Pro 开发一个应用程序 在这个应用程序中 containerView用于添加额外的views并与他们互动 首先 我创建了一个协议 protocol DataViewDelegate func setTouch touc
  • Python 中基于收益的协程与带有 @asyncio.coroutine 和 @types.coroutine 装饰器的协程有何不同?

    我一直在尝试理解异步编程 尤其是 Python 中的异步编程 我知道 asyncio 是基于事件循环构建的 该事件循环安排协程的执行 但我已经阅读了几种定义协程的不同方法 并且我很困惑它们如何相互关联 I read 本文 http masn
  • 从批处理文件调用脚本时如何指定开关参数

    我有一个脚本foo ps1和一个批处理文件foo cmd用于通过双击文件资源管理器中的 cmd 文件来启动脚本 该脚本接受一个开关参数 但我不知道如何提供这种参数 简单的参数就可以了 Foo ps1 param Parameter Swit