标题: [其他] [已解决]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下好像不能顺序执行。
批处理如下:- if ($true){}# == ($true){}# goto ___yiwuyun
- <#BeginBatOperation#
- :___yiwuyun
- @echo off&setlocal&cls
-
- :loop
- set teachername=
- echo;
- echo 直接按回车键将退出程序!
- echo;
- set /P teachername="输入要查询姓名:"
- echo;
- if "%teachername%"=="" exit /b 0
- if "%teachername%"=="*" set teachername=
- (echo $yiwuyun_fileName="%~f0"&echo $strPath="%~dp0"&echo $teacherName="%teachername%"&type "%~f0")|powershell -command -
- echo;
- choice /C YNC /M "Y: 不清屏继续查询(默认) C: 清屏并续查询 N: 退出" /D Y /T 15 /N
- if "%ERRORLEVEL%"=="1" (
- goto loop
- ) else if "%ERRORLEVEL%"=="2" (
- exit/b 0
- ) else (
- cls
- goto loop
- )
- exit/b 0
- #EndBatOperation#>
-
- <#StartPowerShell#>
-
-
- $objExcel=New-Object -ComObject "Excel.Application";
- $objExcel.Workbooks.Open("$strPath\1.xlsx")|Out-Null;
- $objExcel.DisplayAlerts=$false;
- $objExcel.visible=$false;
- $TN=($teacherName.Trim()) -split "\s{1,}";
- for($row=2;$row -lt 308;$row++){
- $username=$objExcel.ActiveSheet.Cells.Item($row,1).Text;
- for($i=0;$i -lt $TN.Count;$i++){
- if($username -match $TN[$i]){
- $account=$objExcel.ActiveSheet.Cells.Item($row,2).Text;
- $password=$objExcel.ActiveSheet.Cells.Item($row,3).Text;
- write "username=$username account=$account password=$password";
- break;
- }
- }
- }
-
- $objExcel.Quit();
-
- <#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版本分别是多少- powershell -c "Get-Host | Select-Object Version"
复制代码
作者: pcl_test 时间: 2016-9-8 00:28
本帖最后由 pcl_test 于 2016-9-8 01:15 编辑
试了下,ps查询有点慢,改成bat+js方案- /*&cls
- @echo off
- set "xls=%~dp01.xlsx"
- :loop
- echo 直接按回车键将退出程序!
- set name=
- set /p name=输入要查询姓名:
- if "%name%"=="" exit
- if "%name%"=="*" set name=
- echo;%name%|cscript -nologo -e:jscript "%~f0" %xls%
- choice /C YNC /M "Y: 不清屏继续查询(默认) C: 清屏并续查询 N: 退出" /D Y /T 15 /N
- if "%ERRORLEVEL%"=="1" (
- goto loop
- ) else if "%ERRORLEVEL%"=="2" (
- exit
- ) else (
- cls
- goto loop
- )
- */
-
-
- var name = WSH.StdIn.ReadLine().replace(/^\s*|\s*$/g,'').split(/\s+/);
- var map={};
- for(var i=0; i<name.length; i++)if(!map[name[i]])map[name[i]]=1;
- var Excel = new ActiveXObject('Excel.Application');
- Excel.DisplayAlerts = 0;
- var WBook = Excel.Workbooks.Open(WSH.Arguments(0));
- for(var i=2; i<=308; i++){
- var username=WBook.ActiveSheet.Cells.Item(i, 1).Text.replace(/^\s*|\s*$/g,'');
- if(map[username]){
- var account=WBook.ActiveSheet.Cells.Item(i, 2).Text;
- var password=WBook.ActiveSheet.Cells.Item(i, 3).Text;
- WSH.echo('username='+username+' account='+account+' password='+password);
- }
- }
- WBook.Close();
- 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 |