首页 > 解决方案 > TCL运行Powershell脚本文件

问题描述

我正在做 TCL 脚本,但我需要一个称为 Powershell 脚本的值来将 AD 属性值返回给 TCL。我不知道如何使用 TCLscript 来调用 Powershell 脚本或 powershell 脚本文件,但我找到了下面的示例,但我无法让它工作。

proc execPowershellCmd {cmd} {
     set cmd "-command $cmd"
     foreach chan {stdin stdout stderr} {
             lassign [chan pipe] rd$chan wr$chan
     }
     if {[catch {
        package require twapi_process
        set cmd [string map [list \" \\\"] $cmd]
        twapi::create_process [auto_execok powershell] -cmdline $cmd -showwindow hidden \
         -inherithandles 1 -stdchannels [list $rdstdin $wrstdout $wrstderr]
     } ret]} {
        return [list -1 "" $ret]
     }
     chan close $wrstdin; chan close $rdstdin; chan close $wrstdout; chan close $wrstderr
     foreach chan [list $rdstdout $rdstderr] {
             chan configure $chan -encoding cp850 -blocking true; # -buffering full?; # -enc?
     }
     set out [read $rdstdout]; set err [read $rdstderr]
     chan close $rdstdout; chan close $rdstderr
     return [list [string compare $err ""] $out $err]
}

标签: powershelltcl

解决方案


我是上面显示的片段的作者,让我说你:它运行。但是,该示例需要 TWAPI 扩展才能工作,我在https://wiki.tcl-lang.org/page/Windows+PowerShell中没有明确说明。procexecPowershellCmd运行单个 Powershell cmd,这是一个更完整的示例:

# Variante, die auch von WISH geht. Synchroner Aufruf eines einzelnen Befehls(blocks).
# Powershell wird jedesmal beendet.

################################################################################
##### Calls a single Powershell command (blocking, hidden)
### Arg: The command to give to Powershell via -command switch
### Ret: A List of three elements:
###  -1 "" <errtext>       -> error from packa re or create_process (twapi)
###   0 <stdouttxt> ""     -> Ok
###   1 "..." <stderrtext> -> Maybe Ok, something written to stderr
#
proc execPowershellCmd {cmd} {
     set cmd "-command $cmd"
     foreach chan {stdin stdout stderr} {
             lassign [chan pipe] rd$chan wr$chan
     }
     if {[catch {
        set cmd [string map [list \" \\\"] $cmd]; # muss noch in Wiki...
        twapi::create_process [auto_execok powershell] -cmdline $cmd -showwindow hidden \
         -inherithandles 1 -stdchannels [list $rdstdin $wrstdout $wrstderr]
     } ret]} {
        return [list -1 "" $ret]
     }
     chan close $wrstdin; chan close $rdstdin; chan close $wrstdout; chan close $wrstderr
     foreach chan [list $rdstdout $rdstderr] {
             chan configure $chan -encoding cp850 -blocking true; # -buffering full?; # -enc?
     }
     set out [read $rdstdout]; set err [read $rdstderr]
     chan close $rdstdout; chan close $rdstderr
     return [list [string compare $err ""] $out $err]
}

package require twapi

lassign [execPowershellCmd {
write-host "Guten Abend von der PowerShell..."
start-sleep -s 10
write-host "...10s Wartezeit sind um!"
# Fehlermeldungen brechen hier nicht mehr hart auf dem Bildschirm durch...
# falsch
exit
}] rc out err
puts "rc: $rc"
puts "out: $out"
puts "err: $err"

输出如下:

c:\Users\matthiasu\usr\pgm\tcl\usr\Tst\powershell>tclkitsh ps9.tcl
rc: 0
out: Guten Abend von der PowerShell...
...10s Wartezeit sind um!

err:

c:\Users\matthiasu\usr\pgm\tcl\usr\Tst\powershell>

推荐阅读