over 5 years ago

目的

將同網域的Windows電腦大量關機

需求

  • 你必須有該網域的administrators之權限。
  • Windows版本XP以上。

方法

Win7和WinXP和Win2008的shutdown這隻程式似乎長得不太一樣,但功能應該大同小異,
打開CMD輸入shutdown /?或者shutdown --help就可得到說明
而我測試的版本為Windows2008,指令為

shutdown /s /m \\電腦名稱 /t 秒數

即可在某固定秒數內將電腦(們)關機。
參數說明可以看windows自訂說明,其實寫得很清楚也不用多提。

問題

  1. 寫成批次檔的話會一直等待已經關閉的電腦回應,關機要很久

    可利用批次檔的START指令,該指令功能就像fork一樣,會自己呼叫新的cmd出來,可以達到一次關閉很多台電腦的功能
    EX:

    START /B shutdown /s /m \\CCCC-12345 /t 10

    而其中/B代表的是幕後執行,因此不會彈出很多個小黑窗。
    另外如果你怕一次執行太多可以用timeout /t 秒數指令延緩執行,
    比如說你可以關10台執行timout /t 20讓他每關10台等待20秒再關下十台這樣。

  2. Win7沒辦法遠端關機?

    可能是防火牆設定的問題,試著允許"檔案與印表機共用"這個欄位試試看。

Reference

 
over 5 years ago

前言

由於網路程式設計課程的關係需要在C++中用到Regular expression,
google之後發現有許多解決方案,如Regex++ 、 Boost.Regex 、 PCRE 、 regix.h 等等,
但考慮到系上工作站未必有安裝上述套件,而PCRE卻是人人都有,
所以我選擇使用pcrecpp這個lib。

安裝

  • Environment: FreeBSD 8.2
% sudo portmaster devel/pcre++

使用

  • CASE 1: FULLMATCH & PARTIAMATCH

    FullMatch就是需要完全相符,就像/^(regular expression code)$/一樣
    PartialMatch則反之

#include <iostream>
#include <pcrecpp .h>
  
int main(int argc, char ** argv)
{
    if (argc != 3)
    {   
        std::cerr < < "Usage: " << argv[0] << " pattern text\n";
        return 1;
    }   
  
    pcrecpp::RE oPattern(argv[1]);
    if (oPattern.FullMatch(argv[2]))
    {   
        std::cout << argv[2] << " fully matches " << argv[1] << "\n";
    }   
    else if (oPattern.PartialMatch(argv[2]))
    {   
        std::cout << argv[2] << " partially matches " << argv[1] << "\n";
    }   
    else
    {   
        std::cout << argv[2] << " dose not match " << argv[1] << "\n";
    }   
}

執行結果

% g++ TestPcre Cpp.cpp `pcre-config --cflags` `pcre++-config --cflags` -   lpcrecpp -o pcrecpp
% ./pcrecpp 
Usage: ./pcrecpp pattern text
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.com"
http://www.qq.com fully matches http:\/\/.*\.qq\.com
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qq.comiii"
http://www.qq.comiii partially matches http:\/\/.*\.qq\.com
% ./pcrecpp "http:\/\/.*\.qq\.com" "http://www.qqq.comiii"
http://www.qqq.comiii dose not match http:\/\/.*\.qq\.com
  • CASE 2:CONSUME之完全比對

    有時候你會想把整個字串比對完,像是你想parse一整篇html或文章中所有的email,你或許會這樣寫

string contents = ...;                 // Fill string somehow
pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
string name, site;
pcrecpp::RE re("([^@]+)@([^\s]+)");
while (re.Consume(&input, &name, &site)) {
  ...;
}

然後就可以成功抓到一篇文章所有的email。

切記,StringPiece一定要記得Wrap,否則會型態不符喔!

Note

經實際測試結果,compile時必須加上

% g++ `pcre-config --cflags` `pcre++-config --cflags` -lpcrecpp

才可以成功compile,且如果他說找不到lpcrecpp請手動symbolic link到/usr/bin下才可執行

% sudo ln -s /usr/local/lib/libpcrecpp.so.0 /usr/lib/

Reference