cmd.exe --> powershell.exe "-File" 和 "-Command" 在同一行

Posted

技术标签:

【中文标题】cmd.exe --> powershell.exe "-File" 和 "-Command" 在同一行【英文标题】:cmd.exe --> powershell.exe "-File" and "-Command" in the same line 【发布时间】:2021-12-22 07:34:43 【问题描述】:

test.ps1 包含:

echo ok

我在命令提示符 (cmd.exe) 中有一行需要通过“-File”选项和“-Command”选项调用 powershell.exe。 使用这种错误的语法:

powershell.exe -File "test.ps1" -Command "echo test"

“-Command”和“echo test”作为参数传递给“test.ps1”脚本文件。实际上输出是:

ok

我希望作为输出:

ok
test

另一方面,如果我反转“-Command”和“-File”选项:

powershell.exe -Command "echo test" -File "test.ps1"

“-File”和“test.ps1”是“-Command”选项参数的简单延续。实际上输出是:

test
-File
test.ps1

我希望作为输出:

test
ok

“-Command”选项的帮助: "如果 Command 的值是字符串,它必须是命令中的最后一个参数,在命令之后键入的任何字符都被解释为命令参数。"。 这是一个严重错误的声明,因此应向 Microsoft 报告错误。

问题:

也就是说,写命令的正确方法是什么?

回答要求:

作为一种解决方案,我想要一个不使用“-Command”选项参数调用文件的方法;所以,即使它有效,我也不想要这样的东西:

powershell.exe -Command "echo test; & \".\test.ps1\""

此命令最终需要用作注册表项(经典子项“Shell\Open\Command”)中的值。

例如目录[HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\Open\Command]:

这行得通:

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Command "if((Get-ExecutionPolicy ) -ne 'AllSigned')  Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force ; & \"%1\""

这不是:

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Command "if((Get-ExecutionPolicy ) -ne 'AllSigned')  Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force " -File "%1"

因为在命令之后键入的任何字符都被解释为命令参数。

Windows 10 专业版 64 位 Powershell 版本:5.1.19041.1237(集成在 Windows 10 中)。

【问题讨论】:

你能用powershell.exe -File "test.ps1" -Command "& echo test"试试吗 这个有实际需要吗? powershell echo test; .\test.ps1 或者相反呢? 此命令最终需要用作注册表项(经典子项“Shell\command”)中的值。 @MarioPalumbo 你能举个例子吗? 这有效:"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Command "if((Get-ExecutionPolicy ) -ne 'AllSigned') Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force ; & \"%1\"" 这不是:"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Command "if((Get-ExecutionPolicy ) -ne 'AllSigned') Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force " -File "%1",因为在命令之后键入的任何字符都被解释为命令参数。 【参考方案1】:

我不确定这样做的实际原因是什么。使用 -command,您可以做很多事情。例如,如果脚本接受一个参数:

# test.ps1
param ($a)
echo ($a)
powershell .\test.ps1 $(write-host test;echo ok)

test
ok
# test.ps1
param ($a)
get-itemproperty ($a)
powershell -file test.ps1 HKLM:\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\Open\Command

(default)    : "C:\Windows\System32\notepad.exe" "%1"
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\Open\Command
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Microsoft.PowerShellScript.1\Shell\Open
PSChildName  : Command
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

【讨论】:

抱歉之前没有说我将不得不用它做什么:This command will ultimately need to be used as a value in a registry key (the classic subkey "Shell\command").

以上是关于cmd.exe --> powershell.exe "-File" 和 "-Command" 在同一行的主要内容,如果未能解决你的问题,请参考以下文章

使用 cmd.exe 或 PowerShell 或 Python 从 Windows 命名管道中读取

powershell 使PowerShell脚本可以从任何地方运行(即CMD.EXE,Explorer,Run Dialog等)

重温:在 cmd.exe 和 PowerShell 的 for 循环中迭代变量赋值

Powershell -Window下比cmd.exe更具可读性易用性可面向对象的命令行客户端

CMD.exe替换[关闭]

windows10 cmd/bash/powershell字体修改