lwhuang 發表於 16-8-17 13:43
powershell的招數,在我的環境 win10 64裡
同樣的程式碼
AB64會成功
我找到解法了
https://msdn.microsoft.com/en-us/powershell/scripting/setup/starting-the-32-bit-version-of-windows-powershell
把ShellExecute 的第3個參數設成 %SystemRoot%\SysWOW64\WindowsPowerShell\v1.0 就好了,注意一下,%SystemRoot% 不會自動取代,要寫死,不然就是
//這是x64 windows
EnableScript("JScript");
<%
WshShell = new ActiveXObject( "WScript.Shell");
wshEnv = WshShell.Environment("process");
AFL("AFL") = wshEnv("AFL");
AFL("SystemRoot") = wshEnv("SystemRoot");
%>
function telegram_ps_x64(msg)//中文 msg ok
{
fullpath=AFL+"/utility/telegram.ps1";
ShellExecute("powershell","-file "+fullpath+" \""+msg+"\"", "",0);
}
function telegram_ps_x86(msg)
{
pspath=SystemRoot+"/SysWOW64/WindowsPowerShell/v1.0/";
_TRACE(pspath);
fullpath=AFL+"/utility/telegram.ps1";
ShellExecute("powershell","-file "+fullpath+" \""+msg+"\"", pspath, 0);
}要用 powershell 只能分2個版本了
本帖最後由 zaqimon 於 16-8-16 11:39 編輯
我目前是使用XMPP的方式送給Hangouts
這樣我在PC或手機都能同時收到訊息
Google目前還沒停止XMPP的後門
我是透過AutoIt去執行sendxmpp32.exe的方式
(sendxmpp原本是perl寫的 我是去找到別人compile好的執行檔)
測試過可以送中文(應該說是UTF-8)沒問題
$pid = Run("sendxmpp32.exe -e -i xxx@gmail.com", "", @SW_HIDE, $STDIN_CHILD)
$re = StdinWrite($pid, StringToBinary($msg & @CRLF, 4))
StdinWrite($pid) ; pipe close
重點是那個StringToBinary轉成UTF-8
我一開始也以為sendxmpp32.exe不支援中文
送中文字我猜會不會是AmiBroker的限制
也許要寫個外部程式轉成UTF-8然後透過STDIN的方式傳送
測試一下powershell 可以取代 curl 送中文
// 先弄一個script file tel.ps1 (http 空格自己拿掉)
$client = New-Object System.Net.WebClient
$url = "h t t p s://api.telegram.org/bot263669:o8t30XG_mT8oP0GAqg7wwxTqxdH5rIc/sendMessage?chat_id=24881&text="+$args
$reply = $client.DownloadData($url);
執行命令為
powershell -file tel.ps1 "中文"
or in AB
ShellExecute("powershell","-file tel.ps1 \"中文\"","",0);
ps: powershell 執行script 權限問題要先打開
Set-ExecutionPolicy RemoteSigned 本帖最後由 lwhuang 於 16-8-16 14:22 編輯
magier 發表於 16-8-16 12:42
測試一下powershell 可以取代 curl 送中文
// 先弄一個script file tel.ps1 (http 空格自己拿掉)
powershell這招不能換行耶,要怎麼換行呢?
我查到有 DownloadDataAsync, 但是這個不會成功,有辦法射後不理嗎?
lwhuang 發表於 16-8-16 13:54
powershell這招不能換行耶,要怎麼換行呢?
沒想過這問題@@稍微改一下script 修正
$client = New-Object System.Net.WebClient;
$txt = "";
foreach($a in $args)
{
$txt = $txt + "`n" + $a;
}
$txt
$url = "h t t p s://api.telegram.org/bot26:qg7wwxTqxdH5rIc/sendMessage?chat_id=1441&text="+$txt
$url
$reply = $client.DownloadData($url);執行變成
powershell -file tel.ps1 第一行第二行第三行
本帖最後由 lwhuang 於 16-8-16 14:30 編輯
magier 發表於 16-8-16 14:20
沒想過這問題@@稍微改一下script 修正
執行變成
好像有點小醜,因為我都不知道會有幾行,希望是一行msg就出去了
curl 的換行是用 --data-urlencode 傳的,看到\n就會換行,全放在網址就不行,會不會有不同的包裝方式?POST?
另外我去試了 DownloadDataAsync ,是不行的,有沒有辦法射後不理?
lwhuang 發表於 16-8-16 14:27
好像有點小醜,因為我都不知道會有幾行,希望是一行msg就出去了
curl 的換行是用 --data-urlencode 傳的, ...
找到一個簡單的方法
單一參數使用\nscript 內部再轉換就可以了
$client = New-Object System.Net.WebClient;
$txt = $args.Replace("\n", "`n")
$url = "h t t p s://api.telegram.org/bot26369:AAHSwwxTqxdH5rIc/sendMessage?chat_id=2441&text="+$txt
$url
$reply = $client.DownloadData($url);powershell -file tel.ps1 "123\n123"
另DownloadDataAsync 使用這個的需求是?
本帖最後由 lwhuang 於 16-8-16 17:52 編輯
magier 發表於 16-8-16 15:20
找到一個簡單的方法
單一參數使用\nscript 內部再轉換就可以了
Async就是希望不要等他做完,就繼續下面的事了,不管他有沒有做完,也不管他有沒有成功,以免網路還是什麼有問題被卡住,他自己努力做而不影響呼叫他的上層,怕本來只是通知的,結果下一筆單被卡住就不好了
本帖最後由 magier 於 16-8-16 19:49 編輯
lwhuang 發表於 16-8-16 17:48
Async就是希望不要等他做完,就繼續下面的事了,不管他有沒有做完,也不管他有沒有成功,以免網路還是什麼 ...
看起來Async的呼叫只能確保在powershell裡面不會被 block 離開AB ShellExecute() 還是要等做完不然好像訊息會傳不出去
應該還是使用同步的方式就好了
ShellExecute並不會block
例如你可以連續執行兩行
ShellExecute("ping","-n 10 127.0.0.1","");
ShellExecute("ping","-n 10 127.0.0.1","");
會跳出兩個視窗
本帖最後由 lwhuang 於 16-8-17 13:46 編輯
magier 發表於 16-8-16 15:20
找到一個簡單的方法
單一參數使用\nscript 內部再轉換就可以了
powershell的招數,在我的環境 win10 64裡
同樣的程式碼
AB64會成功
AB32會失敗,碰巧我的程式交易只能在32跑
lwhuang 發表於 16-8-17 13:43
powershell的招數,在我的環境 win10 64裡
同樣的程式碼
AB64會成功
手邊沒有win10 可以測試
我的環境是win7 32bit + AB 32 bit
magier 發表於 16-8-17 20:46
手邊沒有win10 可以測試
我的環境是win7 32bit + AB 32 bit
我猜不是win10的關係,是 32-bit AB 配不了 64-bit powershell
又練到一招,可以用bot在群組發訊,適合吸收會員的大咖使用,傳到群組裡,所有會員都會看到,不用傳很多次
頁:
[1]
2