Board logo

标题: [其他] [已解决]win2012 下批处理与powershell混编运行时无法按序执行命令语句是什么原因 [打印本页]

作者: yiwuyun    时间: 2016-9-7 21:21     标题: [已解决]win2012 下批处理与powershell混编运行时无法按序执行命令语句是什么原因

本帖最后由 yiwuyun 于 2016-9-8 00:53 编辑

我写了一个小的查询批处理,用来查询EXCEL中的数据。1.xlsx和批处理在同一目录,1.xlsx中有三列数据,第一列为姓名,第二列为帐号,第三列为密码。
运行环境为win10和excel 2016   另一种为win2012 server standard和excel 2016
在win10下,批处理运行正常,会顺序执行。但在win2012下好像不能顺序执行。
批处理如下:
  1. if ($true){}# == ($true){}# goto ___yiwuyun
  2. <#BeginBatOperation#
  3. :___yiwuyun
  4. @echo off&setlocal&cls
  5. :loop
  6. set teachername=
  7. echo;
  8. echo 直接按回车键将退出程序!
  9. echo;
  10. set /P teachername="输入要查询姓名:"
  11. echo;
  12. if "%teachername%"=="" exit /b 0
  13. if "%teachername%"=="*" set teachername=
  14. (echo $yiwuyun_fileName="%~f0"&echo $strPath="%~dp0"&echo $teacherName="%teachername%"&type "%~f0")|powershell -command -
  15. echo;
  16. choice /C YNC /M "Y: 不清屏继续查询(默认) C: 清屏并续查询 N: 退出" /D Y /T 15 /N
  17. if "%ERRORLEVEL%"=="1" (
  18.   goto loop
  19. ) else if "%ERRORLEVEL%"=="2" (
  20.   exit/b 0
  21. ) else (
  22.   cls
  23.   goto loop
  24. )
  25. exit/b 0
  26. #EndBatOperation#>
  27. <#StartPowerShell#>
  28. $objExcel=New-Object -ComObject "Excel.Application";
  29. $objExcel.Workbooks.Open("$strPath\1.xlsx")|Out-Null;
  30. $objExcel.DisplayAlerts=$false;
  31. $objExcel.visible=$false;
  32. $TN=($teacherName.Trim()) -split "\s{1,}";
  33. for($row=2;$row -lt 308;$row++){
  34.   $username=$objExcel.ActiveSheet.Cells.Item($row,1).Text;
  35.   for($i=0;$i -lt $TN.Count;$i++){
  36.     if($username -match $TN[$i]){
  37.       $account=$objExcel.ActiveSheet.Cells.Item($row,2).Text;
  38.       $password=$objExcel.ActiveSheet.Cells.Item($row,3).Text;
  39.       write "username=$username account=$account  password=$password";
  40.       break;
  41.     }
  42.   }
  43. }
  44. $objExcel.Quit();
  45. <#EndPowerShell#>
复制代码
这几行在win2012下有问题

1  (echo $yiwuyun_fileName="%~f0"&echo $strPath="%~dp0"&echo $teacherName="%teachername%"&type "%~f0")|powershell -command -
2  echo;
3  choice /C YNC /M "Y: 不清屏继续查询(默认)         C: 清屏并续查询                N: 退出" /D Y /T 15 /N

在win2012下上面的第1行执行会花一些时间,因此,第3行会先于查询的结果而先显示,感觉这三行就不是顺序执行的,或者说不是先执行完第1行之后再执行下面一行。


这是正常的吗?有什么办法,让第1行执行完之后再执行第2,3行(在win2012下)。
作者: GNU    时间: 2016-9-7 22:31

看下你的W10和2012里面PowerShell版本分别是多少
  1. powershell -c "Get-Host | Select-Object Version"
复制代码

作者: pcl_test    时间: 2016-9-8 00:28

本帖最后由 pcl_test 于 2016-9-8 01:15 编辑

试了下,ps查询有点慢,改成bat+js方案
  1. /*&cls
  2. @echo off
  3. set "xls=%~dp01.xlsx"
  4. :loop
  5. echo 直接按回车键将退出程序!
  6. set name=
  7. set /p name=输入要查询姓名:
  8. if "%name%"=="" exit
  9. if "%name%"=="*" set name=
  10. echo;%name%|cscript -nologo -e:jscript "%~f0" %xls%
  11. choice /C YNC /M "Y: 不清屏继续查询(默认)          C: 清屏并续查询          N: 退出" /D Y /T 15 /N
  12. if "%ERRORLEVEL%"=="1" (
  13.     goto loop
  14. ) else if "%ERRORLEVEL%"=="2" (
  15.     exit
  16. ) else (
  17.     cls
  18.     goto loop
  19. )
  20. */
  21. var name = WSH.StdIn.ReadLine().replace(/^\s*|\s*$/g,'').split(/\s+/);
  22. var map={};
  23. for(var i=0; i<name.length; i++)if(!map[name[i]])map[name[i]]=1;
  24. var Excel = new ActiveXObject('Excel.Application');
  25. Excel.DisplayAlerts = 0;
  26. var WBook = Excel.Workbooks.Open(WSH.Arguments(0));
  27. for(var i=2; i<=308; i++){
  28.     var username=WBook.ActiveSheet.Cells.Item(i, 1).Text.replace(/^\s*|\s*$/g,'');
  29.     if(map[username]){
  30.         var account=WBook.ActiveSheet.Cells.Item(i, 2).Text;
  31.         var password=WBook.ActiveSheet.Cells.Item(i, 3).Text;
  32.         WSH.echo('username='+username+'   account='+account+'   password='+password);
  33.     }
  34. }
  35. WBook.Close();
  36. Excel.quit();
复制代码

作者: yiwuyun    时间: 2016-9-8 00:57

本帖最后由 yiwuyun 于 2016-9-8 01:00 编辑

多谢各位。
我找到原因了,是这一句出了问题
choice /C YNC /M "Y: 不清屏继续查询(默认)         C: 清屏并续查询                N: 退出" /D Y /T 15 /N
其中不能使用TAB键,应使用空格键。
具体为何会这样,我也说不清楚。
批处理是顺序执行的,差点颠覆了我的认知。
ps确实有点慢,但PS的帮助太强大了。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2