使用PowerShell调用一个外部程序来完成一件工作本来是一件很小的事情。但就是这样一件很小的事情,让我郁闷了好几天。

我们知道,如果要在PowerShell中打开记事本,那语句应该是:

如果要调用notepad打开d:\1.txt,那语句应该是:

notepad.exe d:\1.txt

OK,以上都没有问题,一切正常,而且看起来是那么的简单!下面我们看看FlashFXP的命令行用法,我这里是用它进行上传,所以应该是:

d:\progra~1\FlashFXP\flashfxp.exe -upload ftp://user:pass@ip:port  -remotepath="/" -localpath="d:\1.txt"

我们来简单分析一下这个变态的命令,命令本身不变态,变态的是它的参数,你会发现,真是让人开了眼界啊,有“-参数”这样的,也有参数前是裸的,还有“-参数="值"”这样的,我估计PowerShell在处理这样的参数的时候,也有点懵了。尤其是我们还需要把User,pass,ip,port,本地上传路径等替换成变量,就更搞不清楚了。运行的时候,解析出来的结果是错误的,虽然可以打开flashfxp,无法上传,参数理解有误。

我上powershell.com问专家,呵呵,专家叫我不要直接写命令调用,然后给了我两种替换方式。但为什么不能直接调用命令,他也说不出来,我说算不算一个bug,他也说不清楚。

把两种可行的方案共享给大家:

方案一:

$execPath="D:\Progra~1\FlashFXP\flashfxp.exe"$execArgs="-upload ftp://u:p@ip:21 "$execArgs=$execArgs+"-remotepath=`"/`" "$execArgs=$execArgs+"-localpath=`"d:\123\`" "& $execPath $execArgs.Split()

方案二:

Start-Process "D:\Progra~1\FlashFXP\flashfxp.exe" -ArgumentList "-upload ftp://u:p@ip:port  -localpath=`"d:\1.txt`" -remotepath=`"/`""

这里要说明一点的是,PowerShell在处理同一问题时,有多种方法,应尽可能找到快速有效的途径,避免钻牛角尖!

03-15 09:44