[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

问题是这样的,今天我写了一个批处理文件,内容前面部分是这样的:
  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的方式把命令行的输出重定向到界面程序上面去。大致的过程就是这样了。还请各位大大不吝赐教!

E ".c .cpp"是神马?

TOP

关键在 %path% 变量。
执行一个命令时,优先级如下:
  1. 内部命令
  2. 当前目录下的可执行文件(同名按后缀名排列,取第一个)
  3. %path% 变量中的路径(优先级按该变量的值从左至右排列,同目录同名可执行文件按后缀排列)
复制代码

TOP

回复 2# lxzzr
嗯,写错了,是/E  ,就是判断扩展名。

TOP

回复 3# CrLf

不是这个,你大概是没明白我的意思。谢谢。

TOP

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 . . .
复制代码

TOP

很惭愧,C语言还没有学完,所以API没有了解,百度一下
http://topic.csdn.net/u/20100209 ... c-ca4f8d458f96.html
主要看一下10L以下(当然最好是都看一下,不会超过30分钟的)
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

回复 6# Demon
这个,虽说能运行,但和MSDN上面运行批处理方法的说法有出入。

TOP

回复 7# wc726842270
嗯,我又忘记看MSDN了。不过它说第一个参数必须有宿主进程,但我看也不是必须的。不过还是按照它的说法来作好了,这样应该不会有错。另外,我是把批处理和批处理参数全部写在第二个参数中的,这样就出现了我的问题。看了你说的贴子,不错,知道了原因。 CreateProcess 的第一个参数貌似确实不会主动去寻找路径,需要绝对路径。而第二个参数会。还有那个人说的运行cmd c:\a.bat 在我这里却运行得很好。win xp.

TOP

回复 6# Demon


另,我是把批处理和参数合在一起写到第二个参数,没有使用第一个参数。

TOP

回复  Demon
这个,虽说能运行,但和MSDN上面运行批处理方法的说法有出入。
女孩不哭 发表于 2011-12-17 13:38


那你慢慢查MSDN吧。

TOP

返回列表