<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD: Код возврата командного файла при запуске из внешнего приложения]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10660</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10660&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD: Код возврата командного файла при запуске из внешнего приложения».]]></description>
		<lastBuildDate>Sat, 23 May 2015 08:45:48 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD: Код возврата командного файла при запуске из внешнего приложения]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=94156#p94156</link>
			<description><![CDATA[<p>А приемлимое решение лежит рядом:<br />1) явно указывать обработчик командных файлов, т.е. CMD.EXE;<br />2) запускать командные файлы с помощью команды CALL<br /></p><div class="codebox"><pre><code>
intRetCode = objWshShell.Run(&quot;cmd /c call ReturnErrorlevel.cmd ...&quot;, 1, True)</code></pre></div><p>То же самое относится и к случаю запуска одного командного файла из другого в новом процессе (например, если надо задать ключи CMD.EXE для вызываемого файла) — в этом случае возврат в вызывающий файл произойдёт и без CALL, но вот код возврата будет упущен. Попробуйте в Simple.cmd заменить<br /></p><div class="codebox"><pre><code>call ReturnErrorlevel.cmd ...</code></pre></div><p>сначала на<br /></p><div class="codebox"><pre><code>cmd /c ReturnErrorlevel.cmd ...</code></pre></div><p>а потом на<br /></p><div class="codebox"><pre><code>cmd /c call ReturnErrorlevel.cmd ...</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sat, 23 May 2015 08:45:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=94156#p94156</guid>
		</item>
		<item>
			<title><![CDATA[CMD: Код возврата командного файла при запуске из внешнего приложения]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=94155#p94155</link>
			<description><![CDATA[<p>Просматривая <a href="http://ifolder.ru/25573605">архив форума</a> наткнулся в удалённой теме <strong>«VBS: получение кода ошибки?»</strong> на следующее:</p><br /><p><em>2007-05-18 13:24:43</em><br /></p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Хмм... Попутная тема. Для батника, запущенного из-под скрипта, у меня вообще получается интересная песня.</p><p><strong>ReturnErrorlevel.cmd</strong> - сам батник, формирующий коды возврата:<br /></p><div class="codebox"><pre><code>@echo off
setlocal ENABLEEXTENSIONS

if /i &quot;%~1%&quot;==&quot;SETFAILURE&quot; (
    exit /b 1
) else (
    if /i &quot;%~1%&quot;==&quot;SETOK&quot; (
        exit /b 0
    ) else (
        exit /b 2
    )
)

endlocal
</code></pre></div><p><strong>ReturnErrorlevel.vbs</strong> - аналогичный скрипт, формирующий коды возврата:<br /></p><div class="codebox"><pre><code>Dim objArgs
Dim intErrorlevel

Set objArgs = WScript.Arguments

If objArgs.Count &lt;&gt; 0 Then
    Select Case UCase(objArgs(0))
        Case &quot;SETFAILURE&quot;
             intErrorlevel = 1
        Case &quot;SETOK&quot;
             intErrorlevel = 0
        Case Else
             intErrorlevel = 2
    End Select
    
Else
    intErrorlevel = 2
End If

Set objArgs = Nothing

WScript.Quit intErrorlevel
</code></pre></div><p><strong>Simple.cmd</strong> - батник для проверки кодов возврата:<br /></p><div class="codebox"><pre><code>@echo off
setlocal ENABLEEXTENSIONS

echo.
echo Calling ReturnErrorlevel.cmd
echo.

echo Calling with none parameter
    call ReturnErrorlevel.cmd
echo Errorlevel = %errorlevel%

echo Calling with SetOk parameter
call ReturnErrorlevel.cmd SetOk
echo Errorlevel = %errorlevel%

echo Calling with SetFailure parameter
call ReturnErrorlevel.cmd SetFailure
echo Errorlevel = %errorlevel%

pause

echo.
echo Calling ReturnErrorlevel.vbs
echo.

echo Calling with none parameter
cscript.exe /nologo ReturnErrorlevel.vbs
echo Errorlevel = %errorlevel%

echo Calling with SetOk parameter
cscript.exe /nologo ReturnErrorlevel.vbs SetOk
echo Errorlevel = %errorlevel%

echo Calling with SetFailure parameter
cscript.exe /nologo ReturnErrorlevel.vbs SetFailure
echo Errorlevel = %errorlevel%

endlocal
</code></pre></div><p><strong>Simple.vbs</strong> - скрипт для проверки кодов возврата:<br /></p><div class="codebox"><pre><code>Dim objWshShell
Dim intRetCode

Set objWshShell = CreateObject(&quot;WScript.Shell&quot;)

WScript.Echo &quot;Calling ReturnErrorlevel.cmd&quot;

WScript.Echo &quot;Calling with none parameter&quot;
intRetCode = objWshShell.Run(&quot;ReturnErrorlevel.cmd&quot;, 1, True)
WScript.Echo &quot;Errorlevel = &quot; &amp; intRetCode

WScript.Echo &quot;Calling with SetOk parameter&quot;
intRetCode = objWshShell.Run(&quot;ReturnErrorlevel.cmd SetOk&quot;, 1, True)
WScript.Echo &quot;Errorlevel = &quot; &amp; intRetCode

WScript.Echo &quot;Calling with SetFailure parameter&quot;
intRetCode = objWshShell.Run(&quot;ReturnErrorlevel.cmd SetFailure&quot;, 1, True)
WScript.Echo &quot;Errorlevel = &quot; &amp; intRetCode


WScript.Echo &quot;Calling ReturnErrorlevel.vbs&quot;

WScript.Echo &quot;Calling with none parameter&quot;
intRetCode = objWshShell.Run(&quot;ReturnErrorlevel.vbs&quot;, 1, True)
WScript.Echo &quot;Errorlevel = &quot; &amp; intRetCode

WScript.Echo &quot;Calling with SetOk parameter&quot;
intRetCode = objWshShell.Run(&quot;ReturnErrorlevel.vbs SetOk&quot;, 1, True)
WScript.Echo &quot;Errorlevel = &quot; &amp; intRetCode

WScript.Echo &quot;Calling with SetFailure parameter&quot;
intRetCode = objWshShell.Run(&quot;ReturnErrorlevel.vbs SetFailure&quot;, 1, True)
WScript.Echo &quot;Errorlevel = &quot; &amp; intRetCode

Set objWshShell = Nothing
</code></pre></div><p>Результаты трудов.<br /><strong>Simple.cmd:</strong><br /></p><div class="codebox"><pre><code>C:\Program Files\My Scripts\New&gt;Simple.cmd

Calling ReturnErrorlevel.cmd

Calling with none parameter
Errorlevel = 2
Calling with SetOk parameter
Errorlevel = 0
Calling with SetFailure parameter
Errorlevel = 1
Для продолжения нажмите любую клавишу . . .

Calling ReturnErrorlevel.vbs

Calling with none parameter
Errorlevel = 2
Calling with SetOk parameter
Errorlevel = 0
Calling with SetFailure parameter
Errorlevel = 1
</code></pre></div><p><strong>Simple.vbs:</strong><br /></p><div class="codebox"><pre><code>C:\Program Files\My Scripts\New&gt;cscript /nologo Simple.vbs
Calling ReturnErrorlevel.cmd

Calling with none parameter
Errorlevel = 0
Calling with SetOk parameter
Errorlevel = 0
Calling with SetFailure parameter
Errorlevel = 0

Calling ReturnErrorlevel.vbs

Calling with none parameter
Errorlevel = 2
Calling with SetOk parameter
Errorlevel = 0
Calling with SetFailure parameter
Errorlevel = 1
</code></pre></div><p>Причём, независимо от того, через cscript или wscript. Возможно, потому, что в данном случае происходит неявный (явный я тоже пробовал) вызов %comspec% и errorlevel получаем как раз от него, а не от батника?</p></blockquote></div><p><em>2007-05-18 15:18:16</em><br /></p><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Так, нашёл в чём дело: в <em>ReturnErrorlevel.cmd</em> <em>exit /b</em> поменять на <em>exit</em><br /><strong>ReturnErrorlevel.cmd</strong><br /></p><div class="codebox"><pre><code>@echo off
setlocal ENABLEEXTENSIONS

if /i &quot;%~1%&quot;==&quot;SETFAILURE&quot; (
    exit 1
) else (
    if /i &quot;%~1%&quot;==&quot;SETOK&quot; (
        exit 0
    ) else (
        exit 2
    )
)

endlocal
</code></pre></div><p>После чего <em>Simple.vbs</em> отрабатывает правильно и при вызове cmd файла... Но, соответственно, перестаёт правильно работать <em>Simple.cmd</em> ...</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Sat, 23 May 2015 08:43:24 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=94155#p94155</guid>
		</item>
	</channel>
</rss>
