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

你可能感兴趣的:(PowerShell调用外部程序或脚本的几种方式)