标题: [其他] 用WindowsAPI:CreateProcess创建进程执行批处理为何导致变量引用失效? [打印本页]
作者: 女孩不哭 时间: 2011-12-16 23:35 标题: 用WindowsAPI:CreateProcess创建进程执行批处理为何导致变量引用失效?
问题是这样的,今天我写了一个批处理文件,内容前面部分是这样的:- @echo off
- 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的方式把命令行的输出重定向到界面程序上面去。大致的过程就是这样了。还请各位大大不吝赐教!
作者: lxzzr 时间: 2011-12-16 23:40
E ".c .cpp"是神马?
作者: CrLf 时间: 2011-12-17 00:03
关键在 %path% 变量。
执行一个命令时,优先级如下:- 内部命令
- 当前目录下的可执行文件(同名按后缀名排列,取第一个)
- %path% 变量中的路径(优先级按该变量的值从左至右排列,同目录同名可执行文件按后缀排列)
复制代码
作者: 女孩不哭 时间: 2011-12-17 00:06
回复 2# lxzzr
嗯,写错了,是/E ,就是判断扩展名。
作者: 女孩不哭 时间: 2011-12-17 00:08
回复 3# CrLf
不是这个,你大概是没明白我的意思。谢谢。
作者: Demon 时间: 2011-12-17 01:26
test.c- #include <Windows.h>
- #include <stdio.h>
-
- int main()
- {
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(si));
- ZeroMemory(&pi, sizeof(pi));
- CreateProcess("test.bat", NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
- return 0;
- }
复制代码
test.bat- @echo off
- echo %WINDIR%
- pause
复制代码
output- C:\Windows
- Press any key to continue . . .
复制代码
作者: wc726842270 时间: 2011-12-17 01:30
很惭愧,C语言还没有学完,所以API没有了解,百度一下
http://topic.csdn.net/u/20100209 ... c-ca4f8d458f96.html
主要看一下10L以下(当然最好是都看一下,不会超过30分钟的)
作者: 女孩不哭 时间: 2011-12-17 13:38
回复 6# Demon
这个,虽说能运行,但和MSDN上面运行批处理方法的说法有出入。
作者: 女孩不哭 时间: 2011-12-17 13:45
回复 7# wc726842270
嗯,我又忘记看MSDN了。不过它说第一个参数必须有宿主进程,但我看也不是必须的。不过还是按照它的说法来作好了,这样应该不会有错。另外,我是把批处理和批处理参数全部写在第二个参数中的,这样就出现了我的问题。看了你说的贴子,不错,知道了原因。 CreateProcess 的第一个参数貌似确实不会主动去寻找路径,需要绝对路径。而第二个参数会。还有那个人说的运行cmd c:\a.bat 在我这里却运行得很好。win xp.
作者: 女孩不哭 时间: 2011-12-17 13:48
回复 6# Demon
另,我是把批处理和参数合在一起写到第二个参数,没有使用第一个参数。
作者: Demon 时间: 2011-12-17 17:55
回复 Demon
这个,虽说能运行,但和MSDN上面运行批处理方法的说法有出入。
女孩不哭 发表于 2011-12-17 13:38
那你慢慢查MSDN吧。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |