如何在CMD中运行PowerShell

80

我正在尝试在命令行中运行PowerShell脚本。有人给了我一个例子,它确实有效:

powershell.exe -noexit "& 'c:\Data\ScheduledScripts\ShutdownVM.ps1'"

但问题在于我的PowerShell脚本有输入参数,所以我尝试了一下,但它没有起作用:

powershell.exe -noexit "& 'D:\Work\SQLExecutor.ps1 -gettedServerName "MY-PC" ' "

错误信息如下:

无法将术语“D:\Work\SQLExecutor.ps1 -gettedServerName "MY-PC"”识别为 cmdlet、函数的名称。

我该如何解决这个问题?


4
你确定要使用“-noexit”参数吗?这意味着当你的脚本执行完毕后,Shell会一直存在,可能会阻塞CMD中批处理文件的执行。 - x0n
3个回答

113

您需要将参数与文件路径分开:

powershell.exe -noexit "& 'D:\Work\SQLExecutor.ps1 ' -gettedServerName 'MY-PC'"

另一种可能简化语法的选项是使用文件参数和位置参数:

powershell.exe -noexit -file "D:\Work\SQLExecutor.ps1" "MY-PC"

基本上你只需要添加“-file”。 - DustWolf

13

我想在Shay Levy的正确答案上添加以下内容: 如果你创建一个小批处理脚本run.cmd来启动你的PowerShell脚本,你可以让生活变得更容易:

run.cmd

@echo off & setlocal
set batchPath=%~dp0
powershell.exe -noexit -file "%batchPath%SQLExecutor.ps1" "MY-PC"
将其放在与SQLExecutor.ps1相同的路径中,从现在开始只需双击run.cmd即可运行它。
注意: - 如果您需要在run.cmd批处理文件内使用命令行参数,请将它们作为%1...%9传递给powershell脚本(或使用%*传递所有参数),例如:powershell.exe -noexit -file "%batchPath%SQLExecutor.ps1" %* - 变量batchPath包含批处理文件本身的执行路径(这就是表达式%~dp0的用法)。因此,您只需将powershell脚本放在与调用批处理文件相同的路径中。

你可以使用 @powershell.exe -noexit -file "%~dp0SQLExecutor.ps1" "MY-PC" 来实现相同的功能。 - Nuno André
如果你想要摆脱变量batchPath,当然可以这样做。但是由于setlocal的存在,该变量并不会造成任何影响,因为变量的生命周期在脚本退出时结束。@NunoAndré - Matt

7

尝试以下方法:

powershell.exe -noexit D:\Work\SQLExecutor.ps1 -gettedServerName "MY-PC"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接