powershell - 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]
}
解决方案
我是上面显示的片段的作者,让我说你:它运行。但是,该示例需要 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>
推荐阅读
- sql - dplyr 数据库中的 SQL 过滤器查询区分大小写
- angular - Angular 6 - 库上的 AOT 编译,用作主应用程序中的延迟加载插件
- networkx - 这个有向图操作需要哪种算法?
- asp.net-mvc - Entity Framework 6 无法使用 IIS10 读取数据
- if-statement - 在struts 2中测试迭代器值
- python - 类似 C/C++ 的宏 #ifdef 0 在 python 中注释掉代码的方法
- c++ - C++ STL 数据结构恒定时间推送/弹出/随机访问,通过具有可靠的元素指针的索引
- npm - 有没有办法使用 babel 的不同配置生成多个转译文件?
- algorithm - 哪个版本的 Bellman-Ford 算法是正确的,CLRS 还是算法?
- android-activity - 在活动之间共享 ARCore Renderable