Excel의 매크로에서 PowerShell 스크립트를 호출하려고 합니다.
나는 다음과 같은 여러 가지 예를 보았습니다.
retval = Shell("powershell ""C:\MyTest.ps1""", 1)
그러나 이것을 사용하려고 하면 다음과 같습니다.
Sub Connect_01()
Dim x
x = Shell(“powershell.exe ""\\corp\hdq\Path with spaces\PowerShell\Modules\macro01.ps1""", 1)
End Sub
컴파일러 오류가 발생합니다. Syntax error
할당을 제거하면 첫 번째 따옴표 쌍에 오류가 발생합니다.
Expected: list separator or )"
VBA에 대한 경험이 많지 않고 Shell() 명령에 대한 경험도 없으므로 도움을 주시면 감사하겠습니다.
답변1
이를 수행하는 두 번째 방법이 있습니다. 그것은 사용한다Windows 스크립트 호스트의 Exec
방법.
할 수 있다는 큰 장점이 있습니다값 다시 읽기외부 PowerShell, 명령줄 또는 가지고 있는 다른 명령줄 도구에서. 따라서 Excel과 Powershell 간에 양방향 통신이 가능합니다.
엑셀 매크로
Sub RunAndGetCmd()
strCommand = "Powershell -File ""C:\path\to\My PS File.ps1"""
Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)
strOutput = WshShellExec.StdOut.ReadAll
Msgbox strOutput
End Sub
명령에 대한 다른 작업 예는 다음과 같습니다.
strCommand = "ping.exe 127.0.0.1"
strCommand = "Powershell Echo Hello World"
My PS File.ps1
시연할 내 PowerShell 파일은 다음과 같습니다.
echo "Hello World"
$x = 1 + 1
echo $x
echo
PowerShell 파일이나 명령줄 도구 내에서 결과를 얻으면 PowerShell에서 모든 복잡한 작업을 수행할 수 있습니다 . 이는 다음 주소로 글을 쓴다는 의미입니다.표준 출력(표준 출력). 스크립트가 완료된 후 Excel은 다음을 사용하여 모든 값을 읽습니다.WshShellExec.StdOut.ReadAll
공백이 있는 경로가 Excel에서 PowerShell로 올바르게 전달되도록 하려면 경로를 네 개의 큰따옴표로 묶습니다."powershell -file ""C:\my path\"" "
Excel의 결과
주의사항
Run
Wscripts 방법 과 달리 이Exec
방법은 명령줄 창을 숨길 수 없습니다.- 루프를 다음과 같이 사용할 때 안정적인 결과를 얻을 수 없었습니다.Microsoft의 MSDN 기사에 나와 있습니다.외부 명령줄 도구가 완료되었는지 확인하려면
사용된 자원
답변2
대신 이것을 사용해 보세요 1
. 1이 어디서 나오는지 잘 모르겠습니다.
Sub Connect_01()
Dim x as Variant
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1", vbNormalFocus)
End Sub
아니면 모두 함께 제외하세요 -
Sub Connect_01()
Dim x
x = Shell("POWERSHELL.EXE " & "\\corp\hdq\Path with space\PowerShell\Modules\macro01.ps1")
End Sub
답변3
이 스레드의 OP 부분에서 코드에 닫는 괄호가 누락되었습니다. 따라서 '예상: 목록 구분 기호 또는 )" ' 오류가 발생합니다.
x=SHELL(을 사용하는 답변에서 두 가지 중 하나를 시도하십시오. 1) & 앞뒤의 공백을 제거하십시오. 2) &를 사용하는 대신 다음을 사용해 보십시오. +
답변4
POWERSHELL.EXE 대신 PowerShell 전체 경로를 사용하세요. 전체 경로는 C:\Windows\syswow64\WindowsPowerShell\v1.0\PowerShell.exe입니다.