【问题标题】:How can I create a vbs file by batch without losing those lines?如何在不丢失这些行的情况下批量创建 vbs 文件?
【发布时间】:2020-06-03 04:38:17
【问题描述】:

每次我尝试批量创建 vbs 文件时,vbs 文件中都会缺少一些行

@echo off
echo Function RunAsAdmin() >> 2.vbs
echo If WScript.Arguments.length = 0 Then >> 2.vbs
echo CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & _ >> 2.vbs
echo WScript.ScriptFullName & """" & "RunAsAdministrator""",,"runas", 1 >> 2.vbs
echo WScript.Quit >> 2.vbs
echo End If >> test.vbs

批量制作vbs文件时,我需要保留这2行吗?

echo CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & _ >> 2.vbs
echo WScript.ScriptFullName & """" & "RunAsAdministrator""",,"runas", 1 >> 2.vbs`

【问题讨论】:

  • 尝试在文本周围使用"。我认为这是因为您使用了特殊字符/关键字。您可以使用 ^ 转义字符。
  • 与号是特殊字符,必须用胡萝卜转义。
  • 附注,任何重定向都会打开和关闭文件,但>"%outfile%" ( ...all echo here... ) 将打开文件,处理括号内的所有内容,然后关闭文件。这将加快你的代码。顺便说一句,(...) >"%outfile%" 是一样的。
  • 虽然在后者的情况下,您也需要转义嵌套的内部右括号!

标签: windows batch-file cmd escaping


【解决方案1】:

这是避免转义必要性的另一种方法:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_VBS_FILE=%~dp02.vbs"

rem // Write to given output file:
> "%_VBS_FILE%" (
    rem // Read all lines from this batch script that begin with `::::`:
    for /F "delims=" %%V in ('findstr "^::::" "%~f0"') do (
        rem // Store current line string:
        set "VBS_LINE=%%V"
        rem // Toggle delayed expansion to avoid loss of `!`:
        setlocal EnableDelayedExpansion
        rem // Return current line string with preceding `::::` removed:
        echo(!VBS_LINE:*::::=!
        endlocal
    )
)
endlocal
exit /B

::This is the embedded VBS code section with each line preceded by `::::`:
::::Function RunAsAdmin()
::::If WScript.Arguments.length = 0 Then
::::    CreateObject("Shell.Application").ShellExecute "wscript.exe", """" & _
::::        WScript.ScriptFullName & """" & "RunAsAdministrator""", , "runas", 1
::::    WScript.Quit
::::End If

【讨论】:

    【解决方案2】:

    请参阅此如何在批处理文件中Escape Characters

    @echo off
    Title Generate VBS File from batch script
    Set "VBSFile=%~dpn0.vbs"
    Call :Generate_VBS_File
    Pause & Exit
    REM -----------------------------------------------------------------------------
    :Generate_VBS_File
    >"%VBSFile%" ( 
        echo    Function RunAsAdmin(^)
        echo    If WScript.Arguments.length = 0 Then
        echo        CreateObject("Shell.Application"^).ShellExecute "wscript.exe", """" ^& _
        echo        WScript.ScriptFullName ^& """" ^& "RunAsAdministrator""",,"runas", 1
        echo        WScript.Quit
        echo    End If
        echo    End Function
    )
    Exit /B
    REM -----------------------------------------------------------------------------
    

    【讨论】:

    • Hackoo,您不需要转义任何左括号,只需 因为它们是特殊字符和内部右括号,以防止提前关闭带括号的块.
    • @Compo 你是对的! ,所以,我编辑我的答案参考你的评论!谢谢!
    • 转义左括号不是必需的,但也没有害处;为了代码的可读性,我通常会避开它们。无论如何,您需要在:Generate_VBS_File 之前使用exit /B 以避免两次写入文件……
    • 虽然它可能不会损害代码@aschipfl,但它肯定会损害对必须转义的基本理解,(从技术上讲,这就是这个答案的意义所在)。不过,我可能也会添加一个ExitGoTo :EOF 来代替pause
    【解决方案3】:

    在回显到文件时,您需要转义一些特殊字符。下面的代码将为您解决问题。

    echo CreateObject^("Shell.Application"^).ShellExecute "wscript.exe", """" ^& ^_ >>2.vbs
    echo WScript.ScriptFullName ^& """" ^& "RunAsAdministrator""",,"runas",1 >>2.vbs
    

    例如使用 ^ 打印特殊字符,如 _,&。 (注意: ^&-> 将打印 &)

    查看以下链接以了解有关批处理转义字符的更多信息。

    https://www.robvanderwoude.com/escapechars.php

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多