如何使用vc制作dos的外部命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用vc制作dos的外部命令相关的知识,希望对你有一定的参考价值。

如果是获得命令行的话用
GetCommandlLine
http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx

详细,看msdn

顺便给个notepad-mod 例子
//=============================================================================
//
// ParseCommandLine()
//
//
void ParseCommandLine()

LPWSTR lp1,lp2,lp3;
BOOL bContinue = TRUE;
BOOL bIsFileArg = FALSE;
BOOL bIsNotepadReplacement = FALSE;
LPWSTR lpCmdLine = GetCommandLine();
if (lstrlen(lpCmdLine) == 0)
return;
// Good old console can also send args separated by Tabs
StrTab2Space(lpCmdLine);
lp1 = LocalAlloc(LPTR,sizeof(WCHAR)*(lstrlen(lpCmdLine) + 1));
lp2 = LocalAlloc(LPTR,sizeof(WCHAR)*(lstrlen(lpCmdLine) + 1));
lp3 = LocalAlloc(LPTR,sizeof(WCHAR)*(lstrlen(lpCmdLine) + 1));
// Start with 2nd argument
ExtractFirstArgument(lpCmdLine,lp1,lp3);
while (bContinue && ExtractFirstArgument(lp3,lp1,lp2))

// options
if (!bIsFileArg && lstrcmp(lp1,L"+") == 0)
flagMultiFileArg = 2;
bIsFileArg = TRUE;

else if (!bIsFileArg && lstrcmp(lp1,L"-") == 0)
flagMultiFileArg = 1;
bIsFileArg = TRUE;

else if (!bIsFileArg && ((*lp1 == L\'/\') || (*lp1 == L\'-\')))

// LTrim
StrLTrim(lp1,L"-/");
// Encoding
if (lstrcmpi(lp1,L"ANSI") == 0 || lstrcmpi(lp1,L"A") == 0 || lstrcmpi(lp1,L"MBCS") == 0)
flagSetEncoding = IDM_ENCODING_ANSI-IDM_ENCODING_ANSI + 1;
else if (lstrcmpi(lp1,L"UNICODE") == 0 || lstrcmpi(lp1,L"W") == 0)
flagSetEncoding = IDM_ENCODING_UNICODE-IDM_ENCODING_ANSI + 1;
else if (lstrcmpi(lp1,L"UNICODEBE") == 0 || lstrcmpi(lp1,L"UNICODE-BE") == 0)
flagSetEncoding = IDM_ENCODING_UNICODEREV-IDM_ENCODING_ANSI + 1;
else if (lstrcmpi(lp1,L"UTF8") == 0 || lstrcmpi(lp1,L"UTF-8") == 0)
flagSetEncoding = IDM_ENCODING_UTF8-IDM_ENCODING_ANSI + 1;
else if (lstrcmpi(lp1,L"UTF8SIG") == 0 || lstrcmpi(lp1,L"UTF-8SIG") == 0 ||
lstrcmpi(lp1,L"UTF8SIGNATURE") == 0 || lstrcmpi(lp1,L"UTF-8SIGNATURE") == 0 ||
lstrcmpi(lp1,L"UTF8-SIGNATURE") == 0 || lstrcmpi(lp1,L"UTF-8-SIGNATURE") == 0)
flagSetEncoding = IDM_ENCODING_UTF8SIGN-IDM_ENCODING_ANSI + 1;
// EOL Mode
else if (lstrcmpi(lp1,L"CRLF") == 0 || lstrcmpi(lp1,L"CR+LF") == 0)
flagSetEOLMode = IDM_LINEENDINGS_CRLF-IDM_LINEENDINGS_CRLF + 1;
else if (lstrcmpi(lp1,L"LF") == 0)
flagSetEOLMode = IDM_LINEENDINGS_LF-IDM_LINEENDINGS_CRLF + 1;
else if (lstrcmpi(lp1,L"CR") == 0)
flagSetEOLMode = IDM_LINEENDINGS_CR-IDM_LINEENDINGS_CRLF + 1;
// Shell integration
else if (StrCmpNI(lp1,L"appid=",CSTRLEN(L"appid=")) == 0)
StrCpyN(g_wchAppUserModelID,lp1+CSTRLEN(L"appid="),COUNTOF(g_wchAppUserModelID));
StrTrim(g_wchAppUserModelID,L" ");
if (lstrlen(g_wchAppUserModelID) == 0)
lstrcpy(g_wchAppUserModelID,L"(default)");

else if (StrCmpNI(lp1,L"sysmru=",CSTRLEN(L"sysmru=")) == 0)
WCHAR wch[8];
StrCpyN(wch,lp1+CSTRLEN(L"sysmru="),COUNTOF(wch));
StrTrim(wch,L" ");
if (*wch == L\'1\')
flagUseSystemMRU = 2;
else
flagUseSystemMRU = 1;

else switch (*CharUpper(lp1))

case L\'N\':
flagReuseWindow = 0;
flagNoReuseWindow = 1;
if (*CharUpper(lp1+1) == L\'S\')
flagSingleFileInstance = 1;
else
flagSingleFileInstance = 0;
break;
case L\'R\':
flagReuseWindow = 1;
flagNoReuseWindow = 0;
if (*CharUpper(lp1+1) == L\'S\')
flagSingleFileInstance = 1;
else
flagSingleFileInstance = 0;
break;
case L\'F\':
if (*(lp1+1) == L\'0\' || *CharUpper(lp1+1) == L\'O\')
lstrcpy(szIniFile,L"*?");
else if (ExtractFirstArgument(lp2,lp1,lp2))
StrCpyN(szIniFile,lp1,COUNTOF(szIniFile));
TrimString(szIniFile);
PathUnquoteSpaces(szIniFile);

break;
case L\'I\':
flagStartAsTrayIcon = 1;
break;
case L\'O\':
if (*(lp1+1) == L\'0\' || *(lp1+1) == L\'-\' || *CharUpper(lp1+1) == L\'O\')
flagAlwaysOnTop = 1;
else
flagAlwaysOnTop = 2;
break;
case L\'P\':

WCHAR *lp = lp1;
if (StrCmpNI(lp1,L"POS:",CSTRLEN(L"POS:")) == 0)
lp += CSTRLEN(L"POS:") -1;
else if (StrCmpNI(lp1,L"POS",CSTRLEN(L"POS")) == 0)
lp += CSTRLEN(L"POS") -1;
else if (*(lp1+1) == L\':\')
lp += 1;
else if (bIsNotepadReplacement)
if (*(lp1+1) == L\'T\')
ExtractFirstArgument(lp2,lp1,lp2);
break;

if (*(lp+1) == L\'0\' || *CharUpper(lp+1) == L\'O\')
flagPosParam = 1;
flagDefaultPos = 1;

else if (*CharUpper(lp+1) == L\'D\' || *CharUpper(lp+1) == L\'S\')
flagPosParam = 1;
flagDefaultPos = (StrChrI((lp+1),L\'L\')) ? 3 : 2;

else if (StrChrI(L"FLTRBM",*(lp+1)))
WCHAR *p = (lp+1);
flagPosParam = 1;
flagDefaultPos = 0;
while (*p)
switch (*CharUpper(p))
case L\'F\':
flagDefaultPos &= ~(4|8|16|32);
flagDefaultPos |= 64;
break;
case L\'L\':
flagDefaultPos &= ~(8|64);
flagDefaultPos |= 4;
break;
case L\'R\':
flagDefaultPos &= ~(4|64);
flagDefaultPos |= 8;
break;
case L\'T\':
flagDefaultPos &= ~(32|64);
flagDefaultPos |= 16;
break;
case L\'B\':
flagDefaultPos &= ~(16|64);
flagDefaultPos |= 32;
break;
case L\'M\':
if (flagDefaultPos == 0)
flagDefaultPos |= 64;
flagDefaultPos |= 128;
break;

p = CharNext(p);


else if (ExtractFirstArgument(lp2,lp1,lp2))
int itok =
swscanf(lp1,L"%i,%i,%i,%i,%i",&wi.x,&wi.y,&wi.cx,&wi.cy,&wi.max);
if (itok == 4 || itok == 5) // scan successful
flagPosParam = 1;
flagDefaultPos = 0;
if (wi.cx < 1) wi.cx = CW_USEDEFAULT;
if (wi.cy < 1) wi.cy = CW_USEDEFAULT;
if (wi.max) wi.max = 1;
if (itok == 4) wi.max = 0;



break;
case L\'T\':
if (ExtractFirstArgument(lp2,lp1,lp2))
StrCpyN(szTitleExcerpt,lp1,COUNTOF(szTitleExcerpt));
fKeepTitleExcerpt = 1;

break;
case L\'C\':
flagNewFromClipboard = 1;
break;
case L\'B\':
flagPasteBoard = 1;
break;
case L\'E\':
if (ExtractFirstArgument(lp2,lp1,lp2))
if (lpEncodingArg)
LocalFree(lpEncodingArg);
lpEncodingArg = StrDup(lp1);

break;
case L\'G\':
if (ExtractFirstArgument(lp2,lp1,lp2))
int itok =
swscanf(lp1,L"%i,%i",&iInitialLine,&iInitialColumn);
if (itok == 1 || itok == 2) // scan successful
flagJumpTo = 1;


break;
case L\'M\':

BOOL bFindUp = FALSE;
BOOL bRegex = FALSE;
BOOL bTransBS = FALSE;
if (StrChr(lp1,L\'-\'))
bFindUp = TRUE;
if (StrChr(lp1,L\'R\'))
bRegex = TRUE;
if (StrChr(lp1,L\'B\'))
bTransBS = TRUE;
if (ExtractFirstArgument(lp2,lp1,lp2))
if (lpMatchArg)
GlobalFree(lpMatchArg);
lpMatchArg = StrDup(lp1);
flagMatchText = 1;
if (bFindUp)
flagMatchText |= 2;
if (bRegex)
flagMatchText &= ~8;
flagMatchText |= 4;

if (bTransBS)
flagMatchText &= ~4;
flagMatchText |= 8;



break;
case L\'L\':
if (*(lp1+1) == L\'0\' || *(lp1+1) == L\'-\' || *CharUpper(lp1+1) == L\'O\')
flagChangeNotify = 1;
else
flagChangeNotify = 2;
break;
case L\'Q\':
flagQuietCreate = 1;
break;
case L\'S\':
if (ExtractFirstArgument(lp2,lp1,lp2))
if (lpSchemeArg)
LocalFree(lpSchemeArg);
lpSchemeArg = StrDup(lp1);
flagLexerSpecified = 1;

break;
case L\'D\':
if (lpSchemeArg)
LocalFree(lpSchemeArg);
lpSchemeArg = NULL;

iInitialLexer = 0;
flagLexerSpecified = 1;
break;
case L\'H\':
if (lpSchemeArg)
LocalFree(lpSchemeArg);
lpSchemeArg = NULL;

iInitialLexer = 1;
flagLexerSpecified = 1;
break;
case L\'X\':
if (lpSchemeArg)
LocalFree(lpSchemeArg);
lpSchemeArg = NULL;

iInitialLexer = 2;
flagLexerSpecified = 1;
break;
case L\'U\':
flagRelaunchElevated = 1;
break;
case L\'Z\':
ExtractFirstArgument(lp2,lp1,lp2);
flagMultiFileArg = 1;
bIsNotepadReplacement = TRUE;
break;
case L\'?\':
flagDisplayHelp = 1;
break;
default:
break;


// pathname
else

LPWSTR lpFileBuf = LocalAlloc(LPTR,sizeof(WCHAR)*(lstrlen(lpCmdLine) + 1));
cchiFileList = lstrlen(lpCmdLine) - lstrlen(lp3);
if (lpFileArg)
GlobalFree(lpFileArg);
lpFileArg = GlobalAlloc(GPTR,sizeof(WCHAR)*(MAX_PATH+2)); // changed for ActivatePrevInst() needs
StrCpyN(lpFileArg,lp3,MAX_PATH);
PathFixBackslashes(lpFileArg);
if (!PathIsRelative(lpFileArg) && !PathIsUNC(lpFileArg) &&
PathGetDriveNumber(lpFileArg) == -1 /*&& PathGetDriveNumber(g_wchWorkingDirectory) != -1*/)
WCHAR wchPath[MAX_PATH];
lstrcpy(wchPath,g_wchWorkingDirectory);
PathStripToRoot(wchPath);
PathAppend(wchPath,lpFileArg);
lstrcpy(lpFileArg,wchPath);

StrTrim(lpFileArg,L" \\"");
while (cFileList < 32 && ExtractFirstArgument(lp3,lpFileBuf,lp3))
PathQuoteSpaces(lpFileBuf);
lpFileList[cFileList++] = StrDup(lpFileBuf);

bContinue = FALSE;
LocalFree(lpFileBuf);

// Continue with next argument
if (bContinue)
lstrcpy(lp3,lp2);

LocalFree(lp1);
LocalFree(lp2);
LocalFree(lp3);
参考技术A 楼主你的意思我有点不太明白,请说详细一点

常见 Dos命令

Dos命令

  DOS命令为内部命令外部命令,内部命令是随每次启动的COMMAND.COM装入并常驻内存,而外部命令是一条单独的可执行文件。在操作时要记住的是,内部命令在任何都时候可以使用,而外部命令需要保证命令文件在当前目录中,或在Autoexec.bat文件已经被加载了路径。

常见的内部命令:

1.DIR

含义:显示指定路径上所有文件或目录的信息。
格式:DIR [盘符:][路径][文件名][参数]
参数:
/W: 宽屏显示,一排显示5个文件名,而不会显示修改时时间,文件大小等信息;
/P: 分页显示,当屏幕无法将信息完全显示时,可使用其进行分页显示;
/A: 显示具有特殊属性的文件;
/S: 显示当前目录及其子目录下所有的文件。

2.CD

含义:进入指定目录。
格式:CD [ 路径]
举例:CD DOS
CD命令只能进入当前盘符中的目录,其中“CD”为返回到根目录,“CD..”为返回到上一层目录。

3.MD

含义:建立目录。
格式:MD [盘符][路径]
举例:MD TEMP
表示在当前盘符下建立一个名为TEMP的目录。

4.RD

含义:删除目录。
格式:RD [盘符][路径]
举例:RD TEMP
表示删除当前路径下的TEMP目录,需要注意的是,此命令只能删除空目录。

5.COPY

含义:拷贝文件。
格式:COPY [源目录或文件][目的目录或文件]
举例1:COPY C:*.com D: ,表示将C盘根目录下所有扩展名为com的文件拷贝到D盘根目录中。
举例2:COPY C:autoexec.bat c:autoexec.bak ,表示将autoexec.bat文件复制成为扩展名为bak的文件。输入DIR命令,可以发现此变化。

6.DEL

含义:删除文件。
格式:DEL [盘符][路径][文件名][参数]
举例:DEL c:*.bak/p
表示删除当前目录下所以扩展名为bak的文件,参数/p表示可以使用户在删除多个文件时对每个文件都显示删除询问。

7.SYS

含义:传递系统文件命令。
格式:SYS [源盘符][目的盘符]
举例:SYS C: A:
此命令为将A盘传送系统,传送成功后,A盘将成为系统启动盘。

常见的外部命令:

  DOS外部命令就是一些应用程序,这些外部命令都是以文件的形式存在,Windos系统的DOS外部命令保存在Windos主目录下的Command目录中。以下是几个常见的外部命令。

1.EDIT

含义:简单的编辑软件,可以用来编译一些程序和一些批处理文件。
格式:EDIT [盘符][文件名]
举例:EDIT C:Autoexec.bat
输入此命令将打开编译器。在编辑状态下输入文件内容后,按ALT+F键激活菜单,按向下的箭头选择退出(Exit),提示是否要保存刚才输入的内容,如要保存,只需输入Y或者直接回车(Enter)即可。

2.FORMAT

含义:格式化命令,可以完全对软盘和硬盘的格式化操作。
格式:FORMAT A:/S /Q
此命令格式化A盘,参数/Q表示进行快速格式化,/S表示完成格式化后将系统引导文件拷贝到该磁盘。这样软件可以作为DOS系统启动盘了。

3.XCOPY

含义:拷贝命令。
格式:XCOPY [源路径][源目录/文件名][目的目录/文件名][参数]
举例:XCOPY C:ABC D:/S
执行命令后。将把C:ABC目录及目录中的文件全部拷贝到D盘目录下,XCOPY是COPY的增强命令,可以实现对多个子目录进行拷贝,最常见的参数是/S,它可以对一个目录下的所有子目录进行拷贝。

4.DELTREE

含义:删除目录树。
格式:DELTREE [盘符][路径]
举例:DELTREE ARE
表示删除当前路径下的ARE子目录,执行后会提示是否确认删除,按下Y,即可删除。

励志语录:活在当下,别在怀念过去或者憧憬未来中浪费掉你现在的生活。

以上是关于如何使用vc制作dos的外部命令的主要内容,如果未能解决你的问题,请参考以下文章

谁有好的外部命令。dos命令!谢谢了!

常见 Dos命令

Dos命令解析

我在命令提示符里输入DOS命令,怎么总是出现不是内部或外部命令,也不是可运行程序

免安装的MySQL数据库,在dos命令里运行mysqld install,一直出现不是内部或外部命令,也不是可执行的程序

Dos批处理命令bat文件运行完以后自动关闭dos窗口的方法