PowerShell调用外部程序或脚本的几种方式
目录
PowerShell调用外部程序或脚本的方式非常多,下面总结几种调用方式和常规用法。
1. 直接调用
优点:简单易用,但可能不够稳定
说明:直接用程序名称进行调用的前提是程序路径位于环境变量中,如需执行当前文件夹下的程序,应加上.\符号。
例子:
ping是系统程序,位于环境变量路径下,可直接调用
ping 127.0.0.1
powershell执行当前工作目录下的文件,要在前面加.\(这点与CMD不同,CMD可直接运行)
.\testProg.exe
2. Invoke-Expression(别名:iex)
优点:可接收一个字符串作为要运行的完整命令(包括参数)。
说明:除常规调用外,应用场景为命令位于某个文件中,或者是来自用户的输入,也可以动态拼接生成一个字符串形式的命令用于后续执行。
例子:
# 显示5个进程进程
$str = "get-process|select -first 5"
Invoke-Expression $str
3. Invoke-Command(别名:icm)
优点:可对多个计算机下达相同命令。
说明:用WinRM服务执行本地或远程计算机命令
例子:
# 同时在两台服务器 Server1 和 Server2 上 ping Server3
$scriptBlock = {ping Server3}
Invoke-Command -scriptblock $ScriptBlock -ComputerName "Server1","Server2"
4. Invoke-Item(别名ii)
优点:用默认程序打开文件或运行程序。
说明:典型应用场景在于用关联的默认程序打开文件,不推荐用此命令运行程序。
例子:
# 用当前关联的默认编辑器,打开工作目录下所有sql文件
Invoke-Item *.sql
5. 调用操作符 &
优点:对需要传递多个参数的命令非常有用,若组织得好可以提高可读性。
说明:&操作符将一个字符串当做一个可执行的命令或代码块
例子:
- 字符串命令
调用某路径下的应用程序,直接调用如下:
& "D:\Temp\opencc-1.0.5-win64\opencc-1.0.5-win64\opencc.exe" -help
将应用路径存储在变量,然后调用:
$cmd = "D:\Temp\opencc-1.0.5-win64\opencc-1.0.5-win64\opencc.exe"
& $cmd -help
- 代码块
$scriptBlock = {Write-Host 'Hello world'}
& $scriptBlock
- 多参数传递
# 每个参数分开赋值
$cmd = "D:\Temp\opencc-1.0.5-win64\opencc-1.0.5-win64\opencc.exe"
$arg1 = "--input"
$arg2 = "D:\Temp\CopyTest\简体中文.txt"
$arg3 = "--output"
$arg4 = "D:\Temp\CopyTest\繁体中文.txt"
$arg5 = "--config"
$arg6 = "D:\Temp\opencc-1.0.5-win64\s2t.json"
& $cmd $arg1 $arg2 $arg3 $arg4 $arg5 $arg6
# 或用数组将参数组织在一起
$AllArgs = @("--input","D:\Temp\CopyTest\简体中文.txt","--output","D:\Temp\CopyTest\繁体中文.txt","--config","D:\Temp\opencc-1.0.5-win64\s2t.json")
& "D:\Temp\opencc-1.0.5-win64\opencc-1.0.5-win64\opencc.exe" $AllArgs
# 或
& $cmd $AllArgs
若程序位于环境变量下,可不用&操作符,也可以像上面一样传参,以减少错误并提高可读性。如 bcp $arglist
6. Start-Process(别名start)
优点:异步方式创建一个新的进程,默认情况下不影响当前脚本的继续执行,可以用来实现并发调用程序。
说明:创建新进程,并可控制是否出现新窗口,是否等待执行完毕,是否返回进程状态参数等信息,具体可参考文档
例子:
$p = start-process ping -ArgumentList '127.0.0.1' --PassThru
$p.ExitCode
参考资料:
https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx