powershell 上的语法错误,但代码在 reg add 中有效

Syntax error on powershell but code works in reg add

提问人:Royal Rasmussen 提问时间:10/19/2023 最后编辑:marc_sRoyal Rasmussen 更新时间:10/19/2023 访问量:40

问:

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

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

当我将它们组合在一起时,我得到错误

请输入计算机名称或 IP 地址 -AsString: 1.1.1.1
ERROR: Invalid syntax.
键入“REG ADD /?”进行使用。

我知道这是正确的,因为它在管理员模式下打开 PowerShell 并要求我输入。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

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

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 语法错误

评论

1赞 Olaf 10/19/2023
欢迎使用 Stack Overflow。你能正确格式化你的代码吗?🙏🏼 提前致谢。👍🏼🤟🏼

答:

2赞 mklement0 10/19/2023 #1
  • Read-Host 没有交换机。-AsString

    • 它确实有一个开关,要求返回 System.Security.SecureString 实例,但这不是你要找的。-AsSecureString

    • 如果没有此开关,则始终返回字符串。

    • 任何不能识别为引用其声明参数之一的命名参数的参数都会隐式成为参数值的一部分,即提示字符串的 .part,因此只是成为呈现给用户的提示字符串的(不需要的)部分。因此,只需省略它。Read-Host-Prompt-AsString

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

    • 的位置参数是 和 所以这就是 和 分别绑定到。-FilePath-ArgumentListPowershell{$Computername = Read-Host ... }

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

      • 使用脚本块 means 本身不受支持:如果使用脚本块,则其逐字内容(不包括 和 )将作为单个字符串传递。{ ... }{}
  • Windows PowerShell CLI (powershell.exe) 默认将任何未知 CLI 参数的位置参数解释为传递给 () 参数,即形成要执行的 PowerShell 源代码。-Command-c

    • "命令行未转义的字符假定在命令行上具有纯语法功能,因此在 PowerShell 的命令行分析期间会被剥离

    • 任何要传递到的字符,即那些应该构成要执行的 PowerShell 源代码一部分的字符,都必须转义为 ."-Command\"


因此:

# 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
'