文字檔內多了個^M(是dos檔的關係)要怎麼移除呢?
tr -d \r <> newfile
Ex:
#!/usr/local/bin/bash
if [ -d ./ ]; then
for file in ./*.list ; do
tr -d \r < $file > $file.new && mv $file.new $file
done
fi
PS:如果不行就用這個sed -i “s/\r//” FILENAME
2010年6月2日 星期三
2010年5月10日 星期一
DEL功能應用
刪除一個或數個檔案。
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names 指定一個或多個檔案或者目錄清單。
萬用字元可用來刪除多個檔案。
如果指定了一個目錄,該目錄中的所
有檔案都會被刪除。
/P 刪除每一個檔案之前提示確認。
/F 強製刪除只讀檔案。
/S 刪除所有次目錄中的指定的檔案。
/Q 安靜模式。刪除全局萬用字元時,不要求確認
/A 根據屬性選擇要刪除的檔案
屬性 R 只讀檔案 S 系統檔案
H 隱藏檔案 A 存檔檔案
I 無內容索引檔案 L 重分析點
- 表示“否”的前綴
如果命令擴展被啟用,DEL 和 ERASE 更改如下:
/S 開關的顯示句法會顛倒,即只顯示已經刪除的檔案,而不顯示找不到的檔案。
如果遇到無法刪除的檔案可以使用以下的範例來存成*.bat檔
再將無法刪除的檔案拖移至該bat檔上即可刪除
===============================
DEL F A Q %1
RD S Q %1
===============================
DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
names 指定一個或多個檔案或者目錄清單。
萬用字元可用來刪除多個檔案。
如果指定了一個目錄,該目錄中的所
有檔案都會被刪除。
/P 刪除每一個檔案之前提示確認。
/F 強製刪除只讀檔案。
/S 刪除所有次目錄中的指定的檔案。
/Q 安靜模式。刪除全局萬用字元時,不要求確認
/A 根據屬性選擇要刪除的檔案
屬性 R 只讀檔案 S 系統檔案
H 隱藏檔案 A 存檔檔案
I 無內容索引檔案 L 重分析點
- 表示“否”的前綴
如果命令擴展被啟用,DEL 和 ERASE 更改如下:
/S 開關的顯示句法會顛倒,即只顯示已經刪除的檔案,而不顯示找不到的檔案。
如果遇到無法刪除的檔案可以使用以下的範例來存成*.bat檔
再將無法刪除的檔案拖移至該bat檔上即可刪除
===============================
DEL F A Q %1
RD S Q %1
===============================
2010年2月24日 星期三
顯示出系統錯誤訊息
// 若有任何的錯誤, 你可以呼叫下面這個 functin
// 幫你組合出錯誤訊息
void ShowError()
{
LPVOID lpMsgBuf;
/* 中文訊息
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
FORMAT_MESSAGE_FROM_SYSTEM
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language
(LPTSTR) &lpMsgBuf,0,NULL );
*/
// 英文訊息 (比較方便到 Yahoo 查別人如何解決)
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
FORMAT_MESSAGE_FROM_SYSTEM
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK
MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
// 幫你組合出錯誤訊息
void ShowError()
{
LPVOID lpMsgBuf;
/* 中文訊息
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
FORMAT_MESSAGE_FROM_SYSTEM
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //Default language
(LPTSTR) &lpMsgBuf,0,NULL );
*/
// 英文訊息 (比較方便到 Yahoo 查別人如何解決)
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
FORMAT_MESSAGE_FROM_SYSTEM
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,0,NULL );
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK
MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
2010年2月23日 星期二
[轉載]VC/ Vista / Run as administrator 權限
引用 http://www.codeproject.com/KB/vista-security/VistaElevator.aspx?df=100&forumid=368223&exp=0&select=1909847
擷取 Starting an elevated process段 使用ShellExecuteinfo 中的run as 讓系統判斷目前是否需要出現Run as administrator 提示dialog.
BOOLRunElevated( HWND hwnd,
LPCTSTR pszPath,
LPCTSTR pszParameters = NULL,
LPCTSTR pszDirectory = NULL )
{
SHELLEXECUTEINFO shex;
memset( &shex, 0, sizeof( shex) );
shex.cbSize = sizeof( SHELLEXECUTEINFO );
shex.fMask = 0;
shex.hwnd = hwnd;
shex.lpVerb = _T("runas");
shex.lpFile = pszPath;
shex.lpParameters = pszParameters;
shex.lpDirectory = pszDirectory;
shex.nShow = SW_NORMAL;
return ::ShellExecuteEx( &shex );
}
[Search keywords]
[Vista 權限 執行]
[安裝 install regsvr32 COM]
[registry 存取]
[Administrator system account privilege]
擷取 Starting an elevated process段 使用ShellExecuteinfo 中的run as 讓系統判斷目前是否需要出現Run as administrator 提示dialog.
BOOLRunElevated( HWND hwnd,
LPCTSTR pszPath,
LPCTSTR pszParameters = NULL,
LPCTSTR pszDirectory = NULL )
{
SHELLEXECUTEINFO shex;
memset( &shex, 0, sizeof( shex) );
shex.cbSize = sizeof( SHELLEXECUTEINFO );
shex.fMask = 0;
shex.hwnd = hwnd;
shex.lpVerb = _T("runas");
shex.lpFile = pszPath;
shex.lpParameters = pszParameters;
shex.lpDirectory = pszDirectory;
shex.nShow = SW_NORMAL;
return ::ShellExecuteEx( &shex );
}
[Search keywords]
[Vista 權限 執行]
[安裝 install regsvr32 COM]
[registry 存取]
[Administrator system account privilege]
[轉載]Run Delphi Program Elevated under Win Vista & Win 7
最近因為工作上的需要開始接觸 Delphi,這個跟 BCB 很像,但是使用 Pascal 為語言的 IDE,不過這不是重點。
重點是,相較於 XP 在 Vista 和 7 底下多了一個新的系統安全機制 UAC ( User Account Control )。
雖然他的立足點是為了系統的安全性的考量,但是這對於程式設計上卻也是個困擾 :(
假設,你寫了一隻程式,做了一些只有 Administrator 權限才能進行的動作,例如: 修改 Registry、安裝 Driver;
在沒有點右鍵,點選 "Run as Administrator" 的情況下,你的程式可能就莫名其妙的 FAIL 了
而這個原因就在於 UAC 這個機制,他封鎖了所有一般 User 權限外所能進行的動作
那就點右鍵就好啦! 但是如果不能點右鍵呢? 總不能要求使用者每次都去點右鍵選 "Run as Administrator" 吧
很不巧...我要寫的程式連點右鍵的機會都沒有,所以要想辦法讓 UAC 自動提示 User 切換到 Administrator 的權限做事
在網路上找到了下面這個方法 - 嵌入 Manifest
1. 建立 Manifest - Autorun.exe.manifest
基本上照著附圖打就行了,但是記得把 name="Autorun" 中的 Autorun 換成你程式的名字
重點是,相較於 XP 在 Vista 和 7 底下多了一個新的系統安全機制 UAC ( User Account Control )。
雖然他的立足點是為了系統的安全性的考量,但是這對於程式設計上卻也是個困擾 :(
假設,你寫了一隻程式,做了一些只有 Administrator 權限才能進行的動作,例如: 修改 Registry、安裝 Driver;
在沒有點右鍵,點選 "Run as Administrator" 的情況下,你的程式可能就莫名其妙的 FAIL 了
而這個原因就在於 UAC 這個機制,他封鎖了所有一般 User 權限外所能進行的動作
那就點右鍵就好啦! 但是如果不能點右鍵呢? 總不能要求使用者每次都去點右鍵選 "Run as Administrator" 吧
很不巧...我要寫的程式連點右鍵的機會都沒有,所以要想辦法讓 UAC 自動提示 User 切換到 Administrator 的權限做事
在網路上找到了下面這個方法 - 嵌入 Manifest
1. 建立 Manifest - Autorun.exe.manifest
基本上照著附圖打就行了,但是記得把 name="Autorun" 中的 Autorun 換成你程式的名字
2. 建立 RC 檔 - Autorun.exe.rc
內容照抄下面的,檔名換成你剛剛建的 manifest
1 24 Autorun.exe.manifest
#ps 1 資源編號
24 資源類型為RTMAINIFEST
3. Compile RES
在 command line 下進行 compile,指令如下:
brcc32 Autorun.exe.rc -foAutorun.res
4. Include RES file
在你的 pas 檔中把 RES 檔 include 進來
{$R Autorun.res}
5. Rebuild Program
最後重新 build 一下你的程式
如果你的程式在 Vista 跟 7 中有出現一個盾牌的符號,這樣就算大功告成了。
2010年2月7日 星期日
如何在本機使用apt-get install xxx
1.建立一個資料夾並將xxx軟體的*.deb放入該資料夾
#mkdir –p /root/deb/xxx/
#cp –a *.deb /root/deb/xxx/
2./root#dpkg-scanpackages deb /dev/null | gzip > deb/Packages.gz
3.vim /.etc/apt/source.list只加上deb file:/root/ deb/
4.apt-get update
5.apt-get install xxx
你可以使用同樣的方法產生一個源碼庫,但請記住你需要將.orig.tar.gz檔案、.dsc檔案和.diff.gz檔案包含在目錄中,同時必須產生Source.gz檔案而不是Packages.gz檔案。
所使用的命令也不相同,要使用dpkg-scansources,命令如下所示:
/root#dpkg-scansources deb | gzip > deb/Sources.gz
#mkdir –p /root/deb/xxx/
#cp –a *.deb /root/deb/xxx/
2./root#dpkg-scanpackages deb /dev/null | gzip > deb/Packages.gz
3.vim /.etc/apt/source.list只加上deb file:/root/ deb/
4.apt-get update
5.apt-get install xxx
你可以使用同樣的方法產生一個源碼庫,但請記住你需要將.orig.tar.gz檔案、.dsc檔案和.diff.gz檔案包含在目錄中,同時必須產生Source.gz檔案而不是Packages.gz檔案。
所使用的命令也不相同,要使用dpkg-scansources,命令如下所示:
/root#dpkg-scansources deb | gzip > deb/Sources.gz
2010年1月13日 星期三
[轉載]extern(外部變數)&static(靜態外部變數)的差異
以extern為例:
#include#include
using namespace std;
void test1();//測試用函數一
void test2();//測試用函數二
int main(void) //內部
{
extern int a;
for(int i=1;i<=3;i++)
{
cout<<"==========NO."<cout<<"a未進入函數的值="<test1(); //放入函數且不改變
test2(); //改變a的數值
}
system("pause");
return 0;
}
int a=2; //記得要宣告a的變數型態 int
//================ 函數一 =================
void test1() //外部
{
cout<<"函數一:a="<}
//================ 函數二 ==================
void test2() //外部
{
a++;
cout<<"函數二:a+1="<}
========================================
輸出結果為:
==========NO.1==========
a未進入函數的值=2
函數一:a=2
函數二:a+1=3
==========NO.2==========
a未進入函數的值=3
函數一:a=3
函數二:a+1=4
==========NO.3==========
a未進入函數的值=4
函數一:a=4
函數二:a+1=5
========================================
從輸出結果可以看出a的值只要再其中一個地方被改變值不管是不是在程式內被改變還是在函數內被改變
a的值永遠是共用的(被外部&內部共用)
以static為例:
#include
#include
using namespace std;
void test1();//測試用函數一
void test2();//測試用函數二
int main(void)
{
static int a;
for(int i=1;i<=3;i++)
{
cout<<"==========NO."<cout<<"a未進入函數的值="<test1(); //放入函數且不改變
test2(); //改變a的數值
}
system("pause");
return 0;
}
int a=2; //記得要宣告a的變數型態 int
//========== 函數一 ==========
void test1()
{
cout<<"函數一:a="<}
//==========函數二 ==========
void test2()
{
a++;
cout<<"函數二:a+1="<}
========================================
輸出結果為:
==========NO.1==========
a未進入函數的值=0
函數一:a=2
函數二:a+1=3
==========NO.2==========
a未進入函數的值=0
函數一:a=3
函數二:a+1=4
==========NO.3==========
a未進入函數的值=0
函數一:a=4
函數二:a+1=5
========================================
內部的a和外部的a並沒有共用 函數和函數之間共用一個a
#include
using namespace std;
void test1();//測試用函數一
void test2();//測試用函數二
int main(void) //內部
{
extern int a;
for(int i=1;i<=3;i++)
{
cout<<"==========NO."<cout<<"a未進入函數的值="<test1(); //放入函數且不改變
test2(); //改變a的數值
}
system("pause");
return 0;
}
int a=2; //記得要宣告a的變數型態 int
//================ 函數一 =================
void test1() //外部
{
cout<<"函數一:a="<}
//================ 函數二 ==================
void test2() //外部
{
a++;
cout<<"函數二:a+1="<}
========================================
輸出結果為:
==========NO.1==========
a未進入函數的值=2
函數一:a=2
函數二:a+1=3
==========NO.2==========
a未進入函數的值=3
函數一:a=3
函數二:a+1=4
==========NO.3==========
a未進入函數的值=4
函數一:a=4
函數二:a+1=5
========================================
從輸出結果可以看出a的值只要再其中一個地方被改變值不管是不是在程式內被改變還是在函數內被改變
a的值永遠是共用的(被外部&內部共用)
以static為例:
#include
#include
using namespace std;
void test1();//測試用函數一
void test2();//測試用函數二
int main(void)
{
static int a;
for(int i=1;i<=3;i++)
{
cout<<"==========NO."<cout<<"a未進入函數的值="<test1(); //放入函數且不改變
test2(); //改變a的數值
}
system("pause");
return 0;
}
int a=2; //記得要宣告a的變數型態 int
//========== 函數一 ==========
void test1()
{
cout<<"函數一:a="<}
//==========函數二 ==========
void test2()
{
a++;
cout<<"函數二:a+1="<}
========================================
輸出結果為:
==========NO.1==========
a未進入函數的值=0
函數一:a=2
函數二:a+1=3
==========NO.2==========
a未進入函數的值=0
函數一:a=3
函數二:a+1=4
==========NO.3==========
a未進入函數的值=0
函數一:a=4
函數二:a+1=5
========================================
內部的a和外部的a並沒有共用 函數和函數之間共用一個a
[轉載]理解 typedef 與 #define 的差異
話說,因為看不懂前人寫的程式碼,上網查了一下說明.....
也才真正地瞭解 typedef 與 #define 的不同....真是不求甚解丫.....Orz
為了加強印象,增加這個網誌分類....
一來加強理解;二來也算是註記分享
=================================================
為了節省閱讀時間,如果看得懂下面的範例....
基本上,再看下去是沒意義的,因為接下來也只是解釋而已....
Ex 1.
typedef int Alias1[10];
typedef void (*Alias2)(void);
看懂了嗎!?看不懂沒關係,再花點時間繼續看下去囉....
讓我們先來看下面的例子....
typedef int Alias1
main() {
Alias1 PI;
PI = 3.14; }
我們可以把 typedef int Alias1 改寫成 #define Alias1 int
坊間書籍,常以這樣的方式來解釋 typedef
確實,用這樣的方式說明,兩者是相通的....
但是,這樣的說明並無法說明兩者的差異性甚至還造成了混淆
把 #define 的思維套用在 typedef(像我就是.....T^T)
相信有許多人跟我一樣會把 int 與 Alias1 拆開來看....
* int 是一組;Alias1是一組 *
* typedef int Alias1[10];
也就是有了這樣的思維,便無法理解 Ex 1. 而誤以為....
int 要替換成 Alias1[10];void 置換成 (*p)(void)
但是,這樣的敘述似乎又不是合法的,因此陷入迷惑中....
實際上,我們必需把 typedef 視為一個整體的敘述....
在Ex 1. 中的第一個小例子是說明 Alias1代表一個,具有連續10個 int 型態的資料別名....
也就是說,我們可以把Alias1視為一個一維陣列、大小是10個 int,這樣的資料型態用Alias1去稱呼它
在我們的程式碼中,如果我們常常需要使用到這樣的資料型態
我們就可以使用 typedef 去宣告,這麼一個資料型態別名,可以幫助我們去理解程式碼....
同樣的,在Ex 1.中的第二個小例子,也是相同意義只是這個資料型態是一項函式
最後,舉個例子來說明加深彼此的理解吧....
Ex 2.
#include "stdafx.h"
typedef typedef int Alias1[10];
main() {
int A1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Alias1 A2;
for(int i = 0; i <>
using namespace std;
typedef void (* Alias2)(void);
void functionA(void) { cout << "This class A" << endl; }
void functionB(void) { cout << "This class B" << endl; }
int main(int argc, char* argv[]) {
Alias2 pfunction;
pfunction = functionA;
pfunction();
pfunction = functionB;
pfunction();
return 0; }
也才真正地瞭解 typedef 與 #define 的不同....真是不求甚解丫.....Orz
為了加強印象,增加這個網誌分類....
一來加強理解;二來也算是註記分享
=================================================
為了節省閱讀時間,如果看得懂下面的範例....
基本上,再看下去是沒意義的,因為接下來也只是解釋而已....
Ex 1.
typedef int Alias1[10];
typedef void (*Alias2)(void);
看懂了嗎!?看不懂沒關係,再花點時間繼續看下去囉....
讓我們先來看下面的例子....
typedef int Alias1
main() {
Alias1 PI;
PI = 3.14; }
我們可以把 typedef int Alias1 改寫成 #define Alias1 int
坊間書籍,常以這樣的方式來解釋 typedef
確實,用這樣的方式說明,兩者是相通的....
但是,這樣的說明並無法說明兩者的差異性甚至還造成了混淆
把 #define 的思維套用在 typedef(像我就是.....T^T)
相信有許多人跟我一樣會把 int 與 Alias1 拆開來看....
* int 是一組;Alias1是一組 *
* typedef int Alias1[10];
也就是有了這樣的思維,便無法理解 Ex 1. 而誤以為....
int 要替換成 Alias1[10];void 置換成 (*p)(void)
但是,這樣的敘述似乎又不是合法的,因此陷入迷惑中....
實際上,我們必需把 typedef 視為一個整體的敘述....
在Ex 1. 中的第一個小例子是說明 Alias1代表一個,具有連續10個 int 型態的資料別名....
也就是說,我們可以把Alias1視為一個一維陣列、大小是10個 int,這樣的資料型態用Alias1去稱呼它
在我們的程式碼中,如果我們常常需要使用到這樣的資料型態
我們就可以使用 typedef 去宣告,這麼一個資料型態別名,可以幫助我們去理解程式碼....
同樣的,在Ex 1.中的第二個小例子,也是相同意義只是這個資料型態是一項函式
最後,舉個例子來說明加深彼此的理解吧....
Ex 2.
#include "stdafx.h"
typedef typedef int Alias1[10];
main() {
int A1[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Alias1 A2;
for(int i = 0; i <>
using namespace std;
typedef void (* Alias2)(void);
void functionA(void) { cout << "This class A" << endl; }
void functionB(void) { cout << "This class B" << endl; }
int main(int argc, char* argv[]) {
Alias2 pfunction;
pfunction = functionA;
pfunction();
pfunction = functionB;
pfunction();
return 0; }
訂閱:
文章 (Atom)