我们可以在powershell中调用Bat命令而不调用/调用Bat文件吗?
例如bat脚本:
@echo [off]
echo sample batch script
pause
在powershell中
命令必须执行。
你可以模拟大多数东西。
- 例如
PAUSE
. ECHO
与Write-Host
、$Var | Out-Host
相似。
也可以用cmd.exe --% /c
,BUT调用BATCH命令,一旦cmd.exe退出,执行该命令的环境就消失了——以及所设置的任何环境变量。
另一方面,cmd.exe
的输出可以保存到变量中。
在这个例子中:
- 停止解析令牌之后的所有内容都未经处理地传递给CMD。
- 给
dir
的路径是通过先设置环境变量$Env:DirPath = 'C:Userspublic'
,然后在BATCH%DirPath%
中检索环境变量来动态提供的。 - 使用
$Var = $(<code>)
在$Var中保存输出。
注意:右括号NOT在cmd.exe --%
行末尾,因为,如果它是,它将被PowerShell忽略。
$Env:DirPath = 'C:Userspublic'
$Var = $(
cmd.exe --% /c dir "%DirPath%" /w
)
$Var
您还应该能够在cmd.exe --%
命令中使用&
来执行多个BATCH命令,但我还没有尝试过,所以不确定这将如何工作。
-
您不能在PowerShell中直接执行批处理文件命令,因为PowerShell不理解它们。
- 虽然在
cmd.exe
(批处理文件的解释器)和PowerShell中有一个小子集命令具有相同的名称,通过PowerShell为其不同命名的命令提供别名(例如,dir
为Get-ChildItem
)的方式,调用这些少数命令只在除最简单的情况下工作相同,因为PowerShell的参数语法与cmd.exe
有根本不同
- 虽然在
-
您可以通过
cmd.exe
的CLI执行批处理文件命令,即通过cmd /c
(运行cmd /?
获取详细信息)或通过管道命令到cmd.exe
(... | cmd
),但注意以下内容:-
像批处理文件一样,这样的调用在子进程中运行,因此对环境变量的修改不会被调用者看到,例如。
-
命令被解释为交互式
cmd.exe
会话例如,这意味着for
循环必须使用%i
而不是%%i
。 -
传递多个批处理文件命令具有严重的限制:
-
With
cmd /c
,只能传递单个行(任何额外的行都将被忽略),因此必须使用cmd.exe
的&
运算符对多个命令进行排序,只有当这些命令在变量方面不相互依赖时,才有效。# OK - the two commands aren't interdependent. cmd /c 'ver & date /t' # !! NOT OK - the %FOO% value isn't seen by the echo call cmd /c '(Set FOO=bar) & echo %FOO%'
然而,您可以通过
/v
选项启用延迟变量扩展功能,在这种情况下,使用!...!
而不是%...%
可以工作:# OK - thanks to /v and !FOO! cmd /v /c '(Set FOO=bar) & echo !FOO!'
单独地,您可以使用可扩展(双引号)字符串(
"..."
),以便在cmd /c
调用中嵌入PowerShell变量的值,作为Darin回答中显示的--%
技术的替代方案;如果您需要嵌入"
字符,请将其转义为`"
(或""
):$foo = 'bar' # define a PowerShell variable cmd /c "echo $foo" # embed its value in the "..." string
-
多行管道输入:
-
即使您以
@echo off
开始多行输入字符串,您也总是会看到cmd.exe
的启动横幅(Microsoft Windows [Version ...]
)和一个提示字符串(例如C:>
),并且每个命令的源代码行都会在其执行结果之前以任何方式打印。 -
除非代码以显式的
exit
调用退出,否则cmd.exe
的退出代码将不反映最后执行的命令的退出代码。 -
有关更多信息以及在幕后创建临时批处理文件以避免这些限制的辅助函数,请参阅
答案。 -
下面是一个使用Here -string向
cmd.exe
提供多个命令的示例;如前所述,您将看到启动横幅和一个提示字符串,并且源代码行将在每个命令输出之前打印:@' @echo off ver date /t Set FOO=bar echo %FOO% exit '@ | cmd.exe
-
-
-