找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 34564|回复: 10

[其他] 用WindowsAPI:CreateProcess创建进程执行批处理为何导致变量引用失效?

[复制链接]
发表于 2011-12-16 23:35:02 | 显示全部楼层 |阅读模式
问题是这样的,今天我写了一个批处理文件,内容前面部分是这样的:
  1. @echo off
  2. echo %~1|findstr /I |E ".c .cpp">nul
复制代码
我直接使用批处理不会出问题,但是当我用CreateProcess创建进程时会提示:findstr不是可执行的命令或批处理文件。我想系统环境变量是不会改变的,我就郁闷了。但我还是试了下:
set "_findstr=%windir%\system32\findstr.exe" 。我以为可以了,结果还是错误。于是我就直接echo %_findstr% 结果发现%windir%是个空值,只有\system32\findstr.exe,我就搞不懂了。没办法了,我只能使用绝对路径, C:\windows\system32\findstr.exe 于是成功。但是前面为什么会是空值,还请高手指点!
关于那个CreateProcess,我是用创建管道 CreatePipe的方式把命令行的输出重定向到界面程序上面去。大致的过程就是这样了。还请各位大大不吝赐教!
发表于 2011-12-16 23:40:21 | 显示全部楼层
E ".c .cpp"是神马?
发表于 2011-12-17 00:03:13 | 显示全部楼层
关键在 %path% 变量。
执行一个命令时,优先级如下:
  1. 内部命令
  2. 当前目录下的可执行文件(同名按后缀名排列,取第一个)
  3. %path% 变量中的路径(优先级按该变量的值从左至右排列,同目录同名可执行文件按后缀排列)
复制代码
 楼主| 发表于 2011-12-17 00:06:48 | 显示全部楼层
回复 2# lxzzr
嗯,写错了,是/E  ,就是判断扩展名。
 楼主| 发表于 2011-12-17 00:08:46 | 显示全部楼层
回复 3# CrLf

不是这个,你大概是没明白我的意思。谢谢。
发表于 2011-12-17 01:26:26 | 显示全部楼层
test.c

  1. #include <Windows.h>
  2. #include <stdio.h>

  3. int main()
  4. {
  5.     STARTUPINFO si;
  6.     PROCESS_INFORMATION pi;
  7.     ZeroMemory(&si, sizeof(si));
  8.     ZeroMemory(&pi, sizeof(pi));
  9.     CreateProcess("test.bat", NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
  10.     return 0;
  11. }
复制代码
test.bat

  1. @echo off
  2. echo %WINDIR%
  3. pause
复制代码
output

  1. C:\Windows
  2. Press any key to continue . . .
复制代码
发表于 2011-12-17 01:30:25 | 显示全部楼层
很惭愧,C语言还没有学完,所以API没有了解,百度一下
http://topic.csdn.net/u/20100209 ... c-ca4f8d458f96.html
主要看一下10L以下(当然最好是都看一下,不会超过30分钟的)
 楼主| 发表于 2011-12-17 13:38:36 | 显示全部楼层
回复 6# Demon
这个,虽说能运行,但和MSDN上面运行批处理方法的说法有出入。
 楼主| 发表于 2011-12-17 13:45:52 | 显示全部楼层
回复 7# wc726842270
嗯,我又忘记看MSDN了。不过它说第一个参数必须有宿主进程,但我看也不是必须的。不过还是按照它的说法来作好了,这样应该不会有错。另外,我是把批处理和批处理参数全部写在第二个参数中的,这样就出现了我的问题。看了你说的贴子,不错,知道了原因。 CreateProcess 的第一个参数貌似确实不会主动去寻找路径,需要绝对路径。而第二个参数会。还有那个人说的运行cmd c:\a.bat 在我这里却运行得很好。win xp.
 楼主| 发表于 2011-12-17 13:48:26 | 显示全部楼层
回复 6# Demon


另,我是把批处理和参数合在一起写到第二个参数,没有使用第一个参数。
发表于 2011-12-17 17:55:26 | 显示全部楼层
回复  Demon
这个,虽说能运行,但和MSDN上面运行批处理方法的说法有出入。
女孩不哭 发表于 2011-12-17 13:38


那你慢慢查MSDN吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 11:31 , Processed in 0.020528 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表