नोट - सबसे अच्छा समाधान के लिए इस उत्तर के तल परअद्यतन 2014-04-27अनुभाग के लिए कूद।
मुझे लगता था कि जवाब नहीं था। लेकिन फिर डॉसटिप्स उपयोगकर्ता लिविउ ने पाया कि <SUB>
वर्ण (Ctrl-Z, 0x1A, दशमलव 26) में बैच फ़ाइल के भीतर एम्बेडेड होने पर विचित्र प्रभाव पड़ता है। यदि कुछ हद तक एक लाइन टर्मिनेटर की तरह कार्य करता है जैसे बैच कमांड के लिए यह संभव है जो आरईएम (या एक :: टिप्पणी हैक) का पालन करें तो निष्पादित करने के लिए यदि वे Ctrl-Z से पहले हैं। http://www.dostips.com/forum/viewtopic.php?p=13160#p13160
यह एक्सपी होम संस्करण एसपी 3, विस्टा होम प्रीमियम एसपी 2 64 बिट, और विस्टा एंटरप्राइज़ एसपी 2 32 बिट पर पुष्टि हुई है। मुझे लगता है कि यह अन्य विंडोज संस्करणों पर काम करता है।
नोट - नीचे कोड माना जाता है Ctrl-Z वर्णों एम्बेडेड की है। मैं कसम खाता हूं कि आईई 8 के साथ देखे जाने पर मैं उन्हें इस साइट पर देखता था। लेकिन ऐसा लगता है कि वे इस पोस्ट से किसी भी तरह से खो गए हैं और मैं यह नहीं समझ सकता कि उन्हें अब कैसे पोस्ट करना है। मैं स्ट्रिंग <SUB>
::<sub>echo This will execute in batch, but it will fail as vbs.
rem<SUB>echo This will execute in batch, and it is also a valid vbs comment
::'<SUB>echo This will execute in batch and it is also a valid vbs comment
एक सफल बैच/vbs संकर के लिए महत्वपूर्ण है कि साथ पात्रों से बदल दिया है। जब तक प्रत्येक बैच कमांड rem<SUB>
या ::'<SUB>
से पहले होता है, तो vbs इंजन इसे नहीं देख पाएगा, लेकिन बैच कमांड चलाएगा। बस सुनिश्चित करें कि आप EXIT
या EXIT /B
के साथ बैच भाग को समाप्त कर दें। फिर स्क्रिप्ट का शेष सामान्य दिखने वाला vbs हो सकता है।
यदि आवश्यक हो तो भी आपके पास बैच लेबल भी हो सकता है। :'Label
एक वैध vbs टिप्पणी और एक मान्य बैच लेबल दोनों है।
यहां एक छोटी संकर लिपि है। (एम्बेडेड Ctrl-Z चार के स्थान पर फिर से <SUB>
साथ)
::'<SUB>@cscript //nologo //e:vbscript "%~f0" & exit /b
WScript.Echo "Example of a hybrid VBS/batch file"
अद्यतन 2012-04-15
जेब एक समाधान है कि अजीब Ctrl-Z से बचा जाता है मिला, लेकिन यह शुरुआत में ईसीएचओ बंद प्रिंट करता है और कुछ अपरिवर्तनीय चर सेट करता है।
मुझे CTRL-Z के बिना समाधान मिला है जो अपरिवर्तनीय चर को समाप्त करता है और समझने में आसान है।
आम तौर पर विशेष वर्ण &
, |
, <
, >
आदि बैच में एक REM
बयान के बाद काम नहीं करते। लेकिन विशेष पात्र REM.
के बाद काम करते हैं।मुझे http://www.dostips.com/forum/viewtopic.php?p=3500#p3500 पर जानकारी का यह पता चला। एक परीक्षण से पता चलता है कि REM.
अभी भी एक वैध वीबीएस टिप्पणी है। EDIT- जेब की टिप्पणी के आधार पर, REM^
(देखभाल के बाद एक जगह है) का उपयोग करना सुरक्षित है।
तो यहां REM^ &
का उपयोग करके एक छोटा वीबीएस/बैच हाइब्रिड है। शुरुआत में यह केवल REM &
प्रिंट करता है, जबकि जैब का समाधान ECHO OFF
प्रिंट करता है।
rem^ &@cscript //nologo //e:vbscript "%~f0" & exit /b
WScript.Echo "Example of a hybrid VBS/batch file"
यहाँ एक और तुच्छ उदाहरण है कि एक लेबल उप दिनचर्या के लिए एक कॉल सहित कई बैच आदेश, यह दर्शाता है है।
::' VBS/Batch Hybrid
::' --- Batch portion ---------
rem^ &@echo off
rem^ &call :'sub
rem^ &exit /b
:'sub
rem^ &echo begin batch
rem^ &cscript //nologo //e:vbscript "%~f0"
rem^ &echo end batch
rem^ &exit /b
'----- VBS portion ------------
wscript.echo "begin VBS"
wscript.echo "end VBS"
'wscript.quit(0)
मुझे अभी भी CTRL-Z समाधान पसंद है क्योंकि यह सभी अपर्याप्त आउटपुट को समाप्त करता है।
अद्यतन 2012-12-17
टॉम Lavedas सुविधा Google समूह में एक बैच स्क्रिप्ट भर से गतिशील VBS को चलाने के लिए एक विधि पोस्ट: No file VBS hybrid scripting। विधि mshta.exe (माइक्रोसॉफ्ट एचटीएमएल एप्लीकेशन होस्ट) का उपयोग करती है।
उनका मूल बैच समाधान एक बाहरी छोटी VBS.BAT स्क्रिप्ट पर निर्भर करता है ताकि वीबीएस को फॉर/एफ के भीतर निष्पादित किया जा सके। मैंने किसी दिए गए बैच स्क्रिप्ट के भीतर सीधे एम्बेड करने के लिए सुविधाजनक बनाने के लिए थोड़ा वाक्यविन्यास संशोधित किया।
यह काफी धीमी है, लेकिन बहुत सुविधाजनक है। यह वीबीएस की एक पंक्ति को निष्पादित करने के लिए प्रतिबंधित है।
VBS, सामान्य रूप से लिखा गया है को छोड़कर सभी उद्धरण दोगुनी किया जाना चाहिए: एक उद्धरण एक स्ट्रिंग संलग्न ""
के रूप में लिखा जाना चाहिए, और एक स्ट्रिंग """"
के रूप में लिखा जाना चाहिए करने के लिए आंतरिक उद्धरण। आम तौर पर मिनी स्क्रिप्ट को FOR/F के IN() खंड में निष्पादित किया जाता है। इसे सीधे निष्पादित किया जा सकता है, लेकिन केवल तभी अगर स्टडआउट को रीडायरेक्ट किया गया हो या पाइप किया गया हो।
आईई स्थापित होने तक इसे किसी भी विंडोज ओएस पर एक्सपी ऑनवर्ड पर काम करना चाहिए।
@echo off
setlocal
:: Define simple batch "macros" to implement VBS within batch
set "vbsBegin=mshta vbscript:Execute("createobject(""scripting.filesystemobject"")"
set "vbsBegin=%vbsBegin%.GetStandardStream(1).write("
set ^"vbsEnd=):close"^)"
:: Get yesterday's date
for /f %%Y in ('%vbsBegin% date-1 %vbsEnd%') do set Yesterday=%%Y
set Yesterday
pause
echo(
:: Get pi
for /f %%P in ('%vbsBegin% 4*atn(1) %vbsEnd%') do set PI=%%P
set PI
pause
echo(
set "var=name=value"
echo Before - %var%
:: Replace =
for /f "delims=" %%S in (
'%vbsBegin% replace(""%var%"",""="","": "") %vbsEnd%'
) do set "var=%%S"
echo After - %var%
pause
echo(
echo Extended ASCII:
for /l %%N in (0,1,255) do (
%= Get extended ASCII char, except can't work for 0x00, 0x0A. =%
%= Quotes are only needed for 0x0D =%
%= Enclosing string quote must be coded as "" =%
%= Internal string quote must be coded as """" =%
for /f delims^=^ eol^= %%C in (
'%vbsBegin% """"""""+chr(%%N)+"""""""" %vbsEnd%'
) do set "char.%%N=%%~C"
%= Display result =%
if defined char.%%N (
setlocal enableDelayedExpansion
echo( %%N: [ !char.%%N! ]
endlocal
) else echo( %%N: Doesn't work :(
)
pause
echo(
:: Executing the mini VBS script directly like the commented code below
:: will not work because mshta fails unless stdout has been redirected
:: or piped.
::
:: %vbsBegin% ""Hello world"" %vbsEnd%
::
:: But this works because output has been piped
%vbsBegin% ""Hello world"" %vbsEnd% | findstr "^"
pause
अद्यतन 2014-04-27
DosTips पर वहाँ js/vbs/html/hta hybrids and chimeras in cmd/bat का एक बड़ा संग्रह है। विभिन्न लोगों से बहुत अच्छी चीजें।
उस धागे के भीतर, डॉसटिप्स उपयोगकर्ता लिविउ ने beautiful VBS/batch hybrid समाधान की खोज की जो WSF का उपयोग करता है।
<!-- : Begin batch script
@echo off
cscript //nologo "%~f0?.wsf"
exit /b
----- Begin wsf script --->
<job><script language="VBScript">
WScript.Echo "VBScript output called by batch"
</script></job>
मुझे लगता है कि यह समाधान शानदार है। बैच और डब्ल्यूएसएफ अनुभाग स्पष्ट रूप से अच्छे शीर्षकों द्वारा अलग किए जाते हैं। किसी भी विषम वाक्यविन्यास के बिना बैच कोड बिल्कुल सामान्य है। केवल प्रतिबंध है बैच कोड में -->
नहीं हो सकता है।
इसी तरह, डब्लूएसएफ के भीतर वीबीएस कोड बिल्कुल सामान्य है। केवल प्रतिबंध ही वीबीएस कोड में </script>
नहीं हो सकता है।
एकमात्र जोखिम "%~f0?.wsf"
के अनियंत्रित उपयोग को स्क्रिप्ट के रूप में लोड करने के रूप में उपयोग किया जाता है।किसी भी तरह पार्सर ठीक से पाता है और चल रहा है .बीटी स्क्रिप्ट "%~f0"
, और ?.wsf
प्रत्यय रहस्यमय तरीके से सीएससीआरआईपीटी को स्क्रिप्ट को डब्लूएसएफ के रूप में समझने के लिए निर्देश देता है। उम्मीद है कि माइक्रोसोफ्ट कभी भी "फीचर" को अक्षम नहीं करेगा।
चूंकि समाधान डब्लूएसएफ का उपयोग करता है, इसलिए बैच स्क्रिप्ट में किसी भी स्वतंत्र वीबीएस, जेस्क्रिप्ट या अन्य नौकरियां शामिल हो सकती हैं जिन्हें चुनिंदा रूप से बुलाया जा सकता है। प्रत्येक नौकरी भी कई भाषाओं का उपयोग कर सकते हैं।
<!-- : Begin batch script
@echo off
echo batch output
cscript //nologo "%~f0?.wsf" //job:JS
cscript //nologo "%~f0?.wsf" //job:VBS
exit /b
----- Begin wsf script --->
<package>
<job id="JS">
<script language="VBScript">
sub vbsEcho()
WScript.Echo "VBScript output called by JScript called by batch"
end sub
</script>
<script language="JScript">
WScript.Echo("JScript output called by batch");
vbsEcho();
</script>
</job>
<job id="VBS">
<script language="JScript">
function jsEcho() {
WScript.Echo("JScript output called by VBScript called by batch");
}
</script>
<script language="VBScript">
WScript.Echo "VBScript output called by batch"
call jsEcho
</script>
</job>
</package>
'REM.' के साथ आपका दूसरा समाधान भी अच्छा है, लेकिन इसमें कमी है। यदि फ़ाइल 'REM'' (एक्सटेंशन के बिना) नाम से मौजूद है, तो 'REM.'' को 'फ़ाइल नहीं मिली' त्रुटि में परिणाम मिलता है। लेकिन आप 'REM ^:' का उपयोग कर सकते हैं, इसके बजाय, यह हमेशा काम करता प्रतीत होता है। ('आरईएम ^,' 'आरईएम ^; ',' आरईएम^') – jeb
@jeb - ऐसा लगता है कि' आरईएम: 'बिना देखभाल के कभी विफल नहीं हो सकता है, और यह सबसे सरल है। या क्या एक अस्पष्ट स्थिति है जहां यह असफल हो जाती है? – dbenham
हां 'रिम: \ .. \ .. \ windows \ system32 \ calc.exe' यह' rem ^: 'के साथ भी विफल रहता है, लेकिन जाहिर है यह मामला यहां महत्वपूर्ण नहीं है – jeb