2017年12月11日 星期一

免費版Veeam自動化(PowerShell)

利用PowerShell自動排程執行備份
1.開啟PowerShell -> 範例:

#載入Veeam PowerShell
Add-PSSnapin Veeampssnapin

#宣告VM Name(VMWare的VM名稱)
$vm = Find-VBRViEntity -Name "SERVER1"

#執行備份
START-VBRZIP -FOLDER D:\VeeamBackup -Entity $vm

#產出LOG-今天日期變數
$today = Get-Date -DisplayHint Date -Format dd/MM/yyyy

#產出LOG-存到D:\Logs
Find-VBRViEntity -Name "SERVER1" | Export-VBRLogs -FolderPath "D:\Logs" -Compress $today To $today

2.將上述指令另存為 ps1,此範例存為D:\server1.ps1

3.設定自動備份(範例為Windows server2012):
3-1. 控制台->系統管理->工作排程->建立工作
->觸發程序,設定備份週期、時間
->動作->「程式或指令碼」輸入powershell
     ->「新增引數」輸入 -file "D:\server1.ps1"

2017年4月26日 星期三

檔案下載


string sFile = @"c:\temp\ff.pdf";
WebClient wc = new WebClient();
byte[] b = wc.DownloadData(sFile);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment;filename=uu.pdf");
Response.BinaryWrite(b);
Response.End();

取得Client IP

P.S 僅Framkwork 3.5以上有效
string sHostName = System.Net.Dns.GetHostName();
string IP = Dns.GetHostEntry(sHostName).AddressList.First(o => o.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToString();

2017年3月30日 星期四

利用PageMethod,從JS執行CodeBehind函式

1.必要條件:
        a.加入ScriptManager控制項,EnablePageMethods屬性設為True
        b.此函式必須加上[System.Web.Services.WebMethod]
        c.必須宣告為靜態 Static
        d.JS使用PageMethods物件呼叫伺服器端函式。

2.範例
  2.1 ASPX:
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
2.2 CodeBehind:
      [System.Web.Services.WebMethod]
        public static string GetServerTime(string format)
        {
            return DateTime.Now.ToString(format);
        }
2.3 JS:
     //呼叫伺服端函式
     PageMethods.GetServerTime("yyyy/MM/dd HH:mm:ss", onSuccess, onError);
   
     //成功時取出內容  
     function onSuccess(Data) {
        var data = Data;
    }
 
     / /失敗時彈出失敗訊息
    function onError(error) {
        if (error != null)
            alert(error);
    }

依經緯度取得地址

1.在CodeBehind建立命名空間,for Google map api轉出的JSON資料之用途

namespace GoogleGeocodingAPI
{
    public class AddressComponent
    {
        public string long_name { get; set; }
        public string short_name { get; set; }
        public List<string> types { get; set; }
    }
    public class Location
    {
        public string lat { get; set; }
        public string lng { get; set; }
    }
    public class Northeast
    {
        public double lat { get; set; }
        public double lng { get; set; }
    }
    public class Southwest
    {
        public double lat { get; set; }
        public double lng { get; set; }
    }
    public class Viewport
    {
        public Northeast northeast { get; set; }
        public Southwest southwest { get; set; }
    }
    public class Geometry
    {
        public Location location { get; set; }
        public string location_type { get; set; }
        public Viewport viewport { get; set; }
    }
    public class Result
    {
        public List<AddressComponent> address_components { get; set; }
        public string formatted_address { get; set; }
        public Geometry geometry { get; set; }
        public bool partial_match { get; set; }
        public List<string> types { get; set; }
    }
    public class RootObject
    {
        public List<Result> results { get; set; }
        public string status { get; set; }
    }
}

2. 建立函式
        //=======================================================
        //<aummary>緯度經度轉中文地址</summary>
        //<param name="latLng"></param>
        //=======================================================
        private static string latLngToChineseAddress(params string[] latLng)
        {
            string url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + string.Join(",", latLng) + "&language=zh-TW&sensor=true";
            string json = string.Empty;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            using (var response = request.GetResponse())
            {
                using (StreamReader sr = new StreamReader(response.GetResponseStream()))
                {
                    json = sr.ReadToEnd();
                }
            }
            GoogleGeocodingAPI.RootObject rootObj = JsonConvert.DeserializeObject<GoogleGeocodingAPI.RootObject>(json);
            return rootObj.results[0].formatted_address;
        }

3.呼叫轉換函示
private static string GetAddress(string lat,string lng)
        {
            string result = string.Empty;
            result = latLngToChineseAddress(lat, lng);
            return result;
           
        }

2016年7月25日 星期一

字串與數字轉換,currency and string

1.字串型態的數字轉為整數,currency string to int
ex:
string sNN = 100,200,300
int iNN = int.Parse(Regex.Replace(sNN, @",", "")); (iNN=100200300)

2.從sql 取出來的數字(Numeric)轉為有千分位的字串

2016年7月20日 星期三

ReportViewer相關應用-換頁保留標題


一、換頁後,表頭顯示標題列

1.於RDLC設計畫面,開啟進階模式
2.點選 '靜態'(最上層那ㄧ個)
3.屬性 KeepWithGroup -> After
            RepeatOnNewPage -> True


二、不換頁,全部資料在同一頁

1.ReportViewer屬性 ShowPageNavigatiorControls -> False
2.打開RDLC檔,屬性下拉選擇'報表'(Report),或是報表設計範圍外部灰色區域點一下,
找到InteractiveSize項目,高度設為 0cm。

2016年7月1日 星期五

字串應用

1.有小數點的數字字串,四捨五入取整數且加千分位
ex:string gg1 = 123456.78

decimal dgg = Convert.ToDecimal(gg1);
sting gg2 = dgg.ToString("#,#");
結果: 123,457

2016年5月19日 星期四

DataGridView塞入CheckBox、Button,Insert CheckBox、Button into DataGridView

1.塞入CheckBox:
  1.1 在Form_Load裡面:
            int iColumnCount = dataGridView1.ColumnCount;
            if (iColumnCount == 0)
            {
                DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn()
                {
                    Name = "選擇",
                    FalseValue = 0,
                    TrueValue = 1,
                    Visible = true
                };
                dataGridView1.Columns.Add(col);
            }
 
 1.2 檢視有被勾選的項目:
 foreach (DataGridViewRow row in dataGridView1.Rows)
 {
      DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
      if(Convert.ToBoolean(chk.Value))
      {
          string data= row.Cells[1].Value.ToString() ;//取出第1欄位資料
      }
 }

2.塞入Button:
  2.1  在Form_Load裡面:
            int iColumnCount = dataGridView1.ColumnCount;
            if (iColumnCount == 0)
            {
                DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
                dataGridView1.Columns.Add(btn);
                btn.Name = "btn";
                btn.HeaderText = "標題";
                btn.Text = "執行";
                btn.UseColumnTextForButtonValue = true;
            }
  2.2 執行被按下的Button:
        在dataGridView1_CellClick裡面,
         if (e.ColumnIndex == 0)
         {
              ... do something...
              .
           }

2016年1月8日 星期五

開啟新的Form且定時自動關閉

1.Create new Form, name Form2
2.At Form1:
private void btn_Buttin1_Click(object sender, EventArgs e)
{
    Form2 FM2 = new Form2();
    FM2.ShowDialog();
}
3.At Form2:
private void Form2_Shown(object sender, EventArgs e)
{
    this.timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    this.timer1.Interval = 1000; //1秒
    this.Close();
}

2015年3月5日 星期四

將一專案副製成另一新的專案


1.複製專案的目錄成為另一目錄
2.用記事本編輯專案檔,譬如 project.sln,找到Project段落中的資了夾名稱改為新的名稱
3.開啟新專案後,右上角的方案總管,專案名稱改為新名稱

2015年2月24日 星期二

在AD環境,取得登入者的AD帳號

1.using System.DirectoryServices.AccountManagement;
2.var Name1 = UserPrincipal.Current;
   var Name2 = vADName.Surname;
   string UserName = Name2;

2014年11月24日 星期一

DataGridView增加欄位

DataGridViewTextBoxColumn col5 = new DataGridViewTextBoxColumn();
dataGridView1.Columns.Add(col5);
dataGridView1.Columns[5].Name = "Column5";
DataGridViewTextBoxColumn col6 = new DataGridViewTextBoxColumn();
dataGridView1.Columns.Add(col6);
dataGridView1.Columns[6].Name = "Column6";

2014年11月17日 星期一

計算目錄大小及檔案數量

1.使用.Net Framework 4.5
2.using System.IO
3.計算目錄大小:
static long CalculateDirectorySize(DirectoryInfo directory, bool includeSubdirectories)
{
    long totalSize = directory.EnumerateFiles().Sum(file => file.Length);
    if (includeSubdirectories)
    {
         totalSize += directory.EnumerateDirectories().Sum(dir => CalculateDirectorySize(dir, true));
     }
     return totalSize
}
4.計算被指定目錄的檔案數量(含子目錄)
static string CalculateDirectoryFiles(string directory)
{
    string fileCount = null;

    DirectoryInfo dir = new DirectoryInfo(directory);
    int files = dir.EnumerateFiles("*.*", SearchOption.AllDirectories).Count();
    fileCount = files.ToString("#,0");
     return fileCount;
    }

2014年11月5日 星期三

用foreach逐行讀取DataGridView資料


foreach (DataGridViewRow row in dataGridView1.Rows)
{
     string Column1 = row.Cells[0].Value.ToString();
     string Column2 = row.Cells[1].Value.ToString();
}

2014年9月16日 星期二

SQL 的Convert的日期輸出格式

select getdate()
結果:2014-09-16 16:31:38.950

select convert(varchar(10),getdate(), 100)
結果:09 16 2014

select convert(varchar(10),getdate(), 101)
結果:09/16/2014

select convert(varchar(10),getdate(), 102)
結果:2014.09.16

select convert(varchar(10),getdate(), 103)
結果:16/09/2014

select convert(varchar(10),getdate(), 104)
結果:16.09.2014

select convert(varchar(10),getdate(), 105)
結果:16-09-2014

select convert(varchar(10),getdate(), 106)
結果:16 09 2014

select convert(varchar(10),getdate(), 107)
結果:09 16, 201

select convert(varchar(10),getdate(), 108)
結果:16:38:03

select convert(varchar(10),getdate(), 109)
結果:09 16 2014

select convert(varchar(10),getdate(), 110)
結果:09-16-2014

select convert(varchar(10),getdate(), 111)
結果:2014/09/16

select convert(varchar(10),getdate(), 112)
結果:20140916

2014年7月28日 星期一

調整2維陣列的長度

private static T[,] ResizeArray<T>(T[,] original, int rows, int cols)
        {
            var newArray = new T[rows, cols];
            int minRows = Math.Min(rows, original.GetLength(0));
            int minCols = Math.Min(cols, original.GetLength(1));
            for (int i = 0; i < minRows; i++)
                for (int j = 0; j < minCols; j++)
                    newArray[i, j] = original[i, j];
            return newArray;
        }

2014年7月23日 星期三

ReportViewer使用範例

1.在Form1上面放入ReportViewer物件
2.加入資料集:
專案目錄右鍵 -> 加入 -> 新增項目 -> 資料 -> 資料集 -> 預設名稱 DataSet1.xsd
-> 開啟伺服器總管,點選SQL DB -> 將欲使用的Table拖拉到 DataSet視覺化設計工具
3.點ReportViewer右上角的智慧標籤 -> 設計新報表 -> 資料來源 -> DataSet1 -> 可用資料集
F5執行 -> 確認已可看到資料
4.加入查詢功能:
  4.1  DataSet1.xsd 畫面 -> Fill.GetData() -> 右鍵 -> 設定 -> TableAdapter組態精靈
         -> 加入where條件:where Color=@x -> 下一步 -> 完成
  4.2 Form1,ReportViewer上方放入TextBox1、Button
  4.3 Button 事件,將FormLoad事件內容,載入資料區段放進來,將TableAdapter.Fill
        加入參數 TextBox.Text,ex:this.ProductTableAdapter.Fill(this.DataSet1.Product,textBox1.Text);
        -> F5執行

2014年4月11日 星期五

JQuery Mobile-MVC 動態套用佈景主題

參考P.453~460

1.建立Controller,裡面放2個View:Index、Setting
2.建立Index首頁
3.建立Setting畫面

2014年3月25日 星期二

讀取TXT,內容寫到DataGridView



1.文字檔內容(以逗號將每欄位隔開):
SRV1,192.168.100.1,C:\,100,200
SRV2,192.168.100.2,C:\,100,200
SRV3,192.168.100.3,C:\,100,200

2.程式碼
private void Form1_Load(object sender, EventArgs e)
{
    TextReader txtReader = new StreamReader(@".\DiskInfo.txt");
    while (txtReader.Peek() != -1)
    {
        string[] parts = txtReader.ReadLine().Split(',');
        dataGridView1.Rows.Add(parts);
     }
 txtReader.Close();
}