powershell 上出现语法错误,但代码可以在 reg add 中运行

问题描述 投票:0回答:1

基本上,我有一个代码在单独时可以工作,但是当我将它们组合起来时,我收到语法错误。我知道这两个部分单独工作但不能一起工作。下面两部分是

Start-process Powershell -verb runas

$Computername = Read-Host "Please put in Computer Name or IP Address" -AsString
reg add "\\$Computername\HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint" /v RestrictDriverInstallationToAdministrators /t REG_DWORD /d 0 /f 
Pause

当我将它们组合起来时,出现错误

Please put in Computer Name or IP Address -AsString: 1.1.1.1
ERROR: Invalid syntax.
Type "REG ADD /?" for usage.

我知道

Start-process Powershell -verb runas
是正确的,因为它会在管理模式下打开 powershell 并要求我输入。

我知道其余的代码可以工作,因为如果我只使用下面的代码,它就会按预期工作

$Computername = Read-Host "Please put in Computer Name or IP Address" -AsString
reg add "\\$Computername\HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint" /v RestrictDriverInstallationToAdministrators /t REG_DWORD /d 0 /f 
Pause

请让我知道我做错了什么,完整的代码如下。

Start-process Powershell -verb runas {$Computername = Read-Host "Please put in Computer Name or IP Address" -AsString
reg add "\\$Computername\HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint" /v RestrictDriverInstallationToAdministrators /t REG_DWORD /d 0 /f 
Pause}

我尝试过取下

-AsString
。我仍然有同样的错误。我改变了相当多的语法,但无法摆脱错误。

powershell syntax syntax-error
1个回答
0
投票
  • Read-Host
    没有
    -AsString
    开关吗?

    • 它确实有一个

      -AsSecureString
      开关,要求返回
      System.Security.SecureString
      实例,但这不是您想要的。

    • 如果没有此开关,则总是返回一个字符串。

    • 任何

      Read-Host
      不识别为引用其声明参数之一的 named 参数的参数都会隐式成为
      -Prompt
      参数值的一部分,即 提示字符串的一部分。

  • Start-Process
    启动一个外部程序(子进程)。

    • positional 参数是

      -FilePath
      -ArgumentList
      ,因此这就是
      Powershell
      {$Computername = Read-Host ... }
      分别绑定的内容。

    • -ArgumentList
      (
      -Args
      ) 参数接受strings (
      [string[]]
      ) 数组,因为它只能传递给外部程序string 参数。

      • 使用脚本块
        { ... }
        意味着本身支持:如果您使用一个,其逐字内容(不包括
        {
        }
        )将作为单个字符串传递。
  • Windows PowerShell CLI (

    powershell.exe
    ) 默认将任何未知 CLI 参数的位置参数解释为传递给
    -Command
    (
    -c
    ) 参数,即形成要执行的 PowerShell 源代码.

    • "
      命令行未转义的字符被假定为在命令行上具有纯语法功能,因此在 PowerShell 的命令行解析过程中被剥离

    • 任何要

      通过
      传递到"
      -Command
      字符,即那些应该形成要执行的PowerShell源代码的一部分的字符必须被转义为as
      \"


因此:

# Note how the embedded " chars. are escaped as \"
Start-Process -Verb RunAs Powershell '
  $Computername = Read-Host \"Please specify a Computer Name or IP Address\"
  reg add \"\\$Computername\HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint\" /v RestrictDriverInstallationToAdministrators /t REG_DWORD /d 0 /f 
  Pause
'
© www.soinside.com 2019 - 2024. All rights reserved.