Двойные кавычки, передаваемые VBA в строку Powershell - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь создать строку, и внутри мне нужно использовать несколько двойных кавычек, я пытаюсь сделать это разными способами, но все выдают ошибку, пожалуйста, кто-нибудь может мне помочь?

Public Sub Script2()
    Dim ScriptText As String
    ScriptText = "[System.Windows.Forms.MessageBox]::Show(""""Message Text"""",""""Title"""",1)"
    Call shell("PowerShell -noexit powershell.exe  -Executionpolicy Bypass -Command " & ScriptText, vbNormalFocus)
End Sub

Если я попробую таким образом, я получу:

Message : The term 'Message' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
    No line:1 character:88
    + ... ypass -Command[System.Windows.Forms.MessageBox]::Show(Message Text,Ti ...
    +                                                           ~~~~~~~
        + CategoryInfo          : ObjectNotFound: (Message:String) [], CommandNotFoundException
        + FullyQualifiedErrorId : CommandNotFoundException

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

У вас есть два уровня расширения параметров (один для VBA и один для Powershell), поэтому вам нужно дважды избегать кавычек.Удвоенные двойные кавычки позволяют пройти мимо VBA.Обратный удар ускользнет от него для Powershell.

ScriptText = "[System.Windows.Forms.MessageBox]::Show(`""Message Text`"",`""Title`"",1)"
0 голосов
/ 13 декабря 2018

ОК, вот рабочий код (это VBS, но не должно быть особых проблем с его использованием в VBA)

ScriptText = """[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Message Text','Title',1)"""
createobject("wscript.shell").run "powershell.exe  -noexit -Executionpolicy Bypass -Command " & ScriptText
0 голосов
/ 13 декабря 2018

Вы пытались использовать `для каждого ', что вам нужно? Таким образом, вы получите что-то вроде этого:

ScriptText = "[System.Windows.Forms.MessageBox]::Show(`"`"Message Text`"`",`"`"Title`"`",1)"

" обычно резервируется, и если вам нужно записать это встрока, вам нужно ее избежать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...