亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可以在批處理文件中嵌入和執行VBScript而不使用臨時文件嗎?

可以在批處理文件中嵌入和執行VBScript而不使用臨時文件嗎?

可以在批處理文件中嵌入和執行VBScript而不使用臨時文件嗎?長期以來,人們一直在批處理文件中嵌入和執行VBScript。但是我看到的所有公開的解決方案(在最初提出這個問題時)包括編寫臨時VBS文件。例如:在Windows批處理文件中嵌入VBScript.是否可以在批處理中執行嵌入式VBScript而不編寫臨時文件?
查看完整描述

3 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

我以前認為答案是否定的。但是DosTips用戶Liviu發現<SUB>字符(Ctrl-Z,0x1A,十進制26)在批處理文件中嵌入時會產生雙值效應。如果功能有點像行結束符,那么在REM之后的批處理命令(或:cripthack)如果前面有Ctrl-Z,就有可能執行這些命令。http:/www.dostips.com/Forum/viewtopic.php?P=13160#p 13160

這一點已經在XP家庭版SP3,Vista家庭高級sp 2 64位和Vista Enterprisesp2 32位上得到確認。我假設它適用于其他Windows版本。

 - 下面的代碼應該嵌入了Ctrl-Z字符。我發誓,當我看到IE8的時候,我經常在這個網站上看到他們。但是他們似乎已經從這個帖子中消失了,我想不出怎么再發了。我用字符串替換了字符<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引擎將看不到它,但批處理命令將運行。只需確保將批處理部分終止為EXITEXIT /B..然后腳本的其余部分可以是普通的VBS。

如果需要的話,你甚至可以有一個批次標簽。:'Label既是一個有效的VBS注釋,也是一個有效的批處理標簽。

下面是一個簡單的混合腳本。(再次與<SUB>取代嵌入式Ctrl-Z字符)

::'<SUB>@cscript //nologo //e:vbscript "%~f0" & exit /bWScript.Echo "Example of a hybrid VBS / batch file"

更新2012-04-15

Jeb找到了一種解決方案,可以避免尷尬的CTRL-Z,但它在開始時輸出回波,并設置一些無關的變量。

我找到了一個沒有CTRL-Z的解決方案,它消除了無關變量,而且更容易理解。

正常情況下,特殊人物&|<>等不起作用之后REM語句批處理。但是這些特殊的角色REM...我在http:/www.dostips.com/Forum/viewtopic.php?P=3500#P 3500..測試表明REM.仍然是VBS的有效評論。編輯 -根據Jeb的評論,使用起來更安全REM^(插入符號后面有一個空格)。

下面是一個簡單的VBS/批處理混合使用REM^ &..唯一的缺點是指紋REM &一開始,杰布的解決方案ECHO OFF.

rem^ &@cscript //nologo //e:vbscript "%~f0" & exit /bWScript.Echo "Example of a hybrid VBS / batch file"

下面是另一個簡單的示例,它演示了多個批處理命令,包括對標記子例程的調用。

::' VBS/Batch Hybrid::' --- Batch portion ---------rem^ &@echo offrem^ &call :'subrem^ &exit /b:'subrem^ &echo begin batchrem^ &cscript //nologo //e:vbscript "%~f0"rem^ &echo end batchrem^ &exit /b'----- VBS portion ------------wscript.echo "begin VBS"wscript.echo "end VBS"'wscript.quit(0)

我仍然喜歡CTRL-Z解決方案,因為它消除了所有無關的輸出。

更新2012-12-17

TomLavedas發布了一種方法,可以方便地從GoogleGroups的批處理腳本中運行動態VBS:無文件VBS混合腳本..該方法使用mshta.exe(MicrosoftHTML應用程序主機)。

他最初的批處理解決方案依賴于一個外部的小型VBS.BAT腳本來執行一個for/F中的VBS。我稍微修改了語法,以便于直接嵌入到任何給定的批處理腳本中。

它很慢,但很方便。它僅限于執行VBS的一行。

VBS是正常編寫的,但所有引號必須加倍:包含字符串的引號必須寫為"",并且字符串內部的引號必須寫為""""..通常,Mini腳本是在for/F的IN()子句中執行的,它可以直接執行,但只有在stdout被重定向或管道化時才能執行。

只要安裝了IE,它就可以從XP開始在任何Windows操作系統上工作。

@echo off
setlocal:: Define simple batch "macros" to implement VBS within batchset "vbsBegin=mshta vbscript:Execute("createobject(""scripting.filesystemobject"")"
set "vbsBegin=%vbsBegin%.GetStandardStream(1).write("
set ^"vbsEnd=):close"^)":: Get yesterday's datefor /f %%Y in ('%vbsBegin% date-1 %vbsEnd%') do set Yesterday=%%Yset Yesterday
pause
echo(:: Get pifor /f %%P in ('%vbsBegin% 4*atn(1) %vbsEnd%') do set PI=%%Pset 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雜交和cmd/bat中的嵌合體..很多來自不同的人的好東西。

在這個線程中,DosTips用戶liviu發現了一個漂亮的VBS/批處理混合使用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>

我覺得這個解決方案太棒了。批處理部分和WSF部分顯然由很好的頭分隔。批處理代碼是絕對正常的,沒有任何奇怪的語法。唯一的限制是批處理代碼不能包含-->.

類似地,WSF中的VBS代碼是絕對正常的。唯一的限制是vbs代碼不能包含</script>.

唯一的風險是非法使用"%~f0?.wsf"作為要加載的腳本。解析器以某種方式正確地找到并加載正在運行的.bat腳本"%~f0",以及?.wsf后綴神秘地指示CSCRIPT將腳本解釋為WSF。希望微軟永遠不會禁用這個“功能”。

由于解決方案使用WSF,批處理腳本可以包含任意數量的獨立VBS、JScript或其他可以選擇性調用的作業。每個作業甚至可以使用多種語言。

<!-- : Begin batch script@echo off
echo batch output
cscript //nologo "%~f0?.wsf" //job:JS
cscript //nologo "%~f0?.wsf" //job:VBSexit /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>


查看完整回答
反對 回復 2019-06-26
  • 3 回答
  • 0 關注
  • 961 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號