为什么cmd里无法cmd如何实现快速粘贴复制._name_这个命令

uboot下执行U_BOOT_CMD 定义的命令
我的图书馆
uboot下执行U_BOOT_CMD 定义的命令
今天研究了一下uboot中怎么用do_run()函数来执行定义好的一些命令,发现其实也挺简单的,关键是得把do_run函数的几个参数吃透,这几个参数都是由uboot commmod 的cmd_tbl_s结构体决定的,U_BOOT_CMD的宏定义也取决于它,如下:
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}
struct cmd_tbl_s {&& &char&& &&& &*name;&& &&& &/* Command Name&& &&& &&& &*/&& &int&& &&& &maxargs;&&&/* maximum number of arguments&& &*/&& &int&& &&& &repeatable;&& &/* autorepeat allowed?&& &&& &*/&& &&& &&& &&& &&& &/* Implementation function&& &*/&& &int&& &&& &(*cmd)(struct cmd_tbl_s *, int, int, char *[]);&& &char&& &&& &*usage;&& &&& &/* Usage message&& &(short)&& &*/#ifdef&& &CONFIG_SYS_LONGHELP&& &char&& &&& &*help;&& &&& &/* Help& message&& &(long)&& &*/#endif#ifdef CONFIG_AUTO_COMPLETE&& &/* do auto completion on the arguments */&& &int&& &&& &(*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);#endif}
&&&&&&& 对比两者后很容易就明白了怎样去定义一个uboot下的命令。
&&&&&&& 接下来看看do_run函数的定义(在../boot/common/main.c下):
#if defined(CONFIG_CMD_RUN)int do_run (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]){&& &&& &if (argc & 2) {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //参数个数小于2则提示重新输入&& &&& &cmd_usage(cmdtp);&& &&& &return 1;&& &}&& &for (i=1; i& ++i) {&& &&& &char *&& &&& &if ((arg = getenv (argv[i])) == NULL) {&& &&& &&& &printf ("## Error: \"%s\" not defined\n", argv[i]);&& &&& &&& &return 1;&& &&& &}#ifndef CONFIG_SYS_HUSH_PARSER&& &&& &&& &&& &&& &if (run_command (arg, flag) == -1){&&&& //调用run_command函数,先查找命令,然后执行命令&& &&& &&& &return 1;&& &&& &}#else&& &&& &if (parse_string_outer(arg,&& &&& &&&& FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP) != 0){&& &&& &&& &return 1;&& &&& &}#endif&& &}&& &return 0;}
&&&&& 其中第一个参数cmd_tbl_t * cmdtp为Command Table,即命令表参数,该结构体的定义在common.h下,一般设为NULL。
&&&&& 第二个参数int flag为Command Flag,用来标志命令来自哪里,跟它相关的有两个宏:
#define CMD_FLAG_REPEAT&& &&& &0x0001&& &/* repeat last command&& &&& &*/#define CMD_FLAG_BOOTD&& &&& &0x0002&& &/* command is from bootd&& &*/
&&&&&& 它被传给run_command (const char *cmd, int flag),一般设为0,表示bootd,设为1则表示repeat(递归式)。
&&&&&&& 第三个int argc表示输入参数的个数,小于2则提示重新输入。第三个char *argv[]是输入命令字符的指针,用来传递定义好的指针数组。下面通过一个简单的例子来说明怎么使用do_run()函数,yaffs2ram的作用是实现从yaffs文件系统中拷贝logo.bmp到指定的RAM地址上:
int yaffs2ram(void)
& char *argv[5];&& //定义5个指针数组,用来存放各个字符命令的指针
& char buf[100];
& char *name_buf = "/logo/logo.bmp";
&& if(!yaffs_file_exist(name_buf))//检查文件系统中是否存在logo.bmp&& &{&& &&& &dprintf_line("%s NOT Exist!",name_buf);&& &&& &return -1;&& &}
//把yrdm& /logo/logo.bmp& 0x命令传给buf(loadaddr为环境变量)
&&& sprintf(buf,"yrdm %s ${loadaddr}",name_buf);&& &setenv("upgradetemp", buf);//设置临时环境变量upgradetemp的值&& &argv[0] = "run";&& &argv[1] = "upgradetemp";&& &argv[2] = NULL;&& &ret = do_run(NULL, 0, 2, argv);&& //运行yrdm& /logo/logo.bmp& 0x命令,把logo.bmp拷贝到0x地址上
&&& if ( ret == 1)
&&&&&&&& printf("do_run error!")
&&&&&&& return -1;
&&&&&&&& }
&&& setenv("upgradetemp", NULL); //清空临时环境变量的值
注:由于do_yrdm函数规定输入命令的个数必须为3(如下所示),所以我们加了一个argv[2] = NULL命令,该命令什么都不做。
U_BOOT_CMD(&&& yrdm,&& 3,& 0,& do_yrdm,&&& "read file to memory from yaffs",&&& "filename offset");
[转]&[转]&
喜欢该文的人也喜欢网页版学习工具
cmdname的中文翻译及音标
沪江词库精选cmdname是什么意思、英语单词推荐、中英文句子翻译、英语短语
[ snick ]的过去式
[ plutocracy ]的相关副词;[ plutocrat ]的相关副词;[ plutocratic ]的相关副词;[ plutocratical ]的相关副词
four thousand one hundred and forty two
seven thousand one hundred and forty two
[ mallard ]的复数形式
two thousand and one
[ rewire ]的第三人称单数;[ rewiring ]的第三人称单数用新PowerShell 运行旧的CMD命令 - PowerShell 中文博客PowerShell中运行CMD命令的技巧总结(解决名称冲突和特殊字符等问题)
转载 &更新时间:日 11:42:54 & 作者:
这篇文章主要介绍了PowerShell中运行CMD命令的技巧总结(解决名称冲突和特殊字符等问题),需要的朋友可以参考下
我从老旧的 CMD.EXE 命令行换到优秀的 POWSERSHELL.EXE 已经有一段时间啦。您可能知道新的 Windows PowerShell 可以运行任何旧命令。不过有些旧命令的名称或语法可能会产生问题。但这都不是事儿。
麻烦 1:名称冲突
PowerShell 的 cmdlet 别名和旧命令的名称有冲突是个常见的问题。比如说您喜欢的服务控制命令 SC.EXE。SC.EXE 非常灵活!我能理解您为什么喜欢它(不要为用 NET.EXE 管理服务找借口)。如果您想查看 SMB Server 服务的状态,可以在 CMD.EXE 里这样用: 代码如下:C:\&SC QUERY LANMANSERVER
SERVICE_NAME: LANMANSERVERTYPE : 20 WIN32_SHARE_PROCESSSTATE : 4 RUNNING(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)WIN32_EXIT_CODE : 0 (0x0)SERVICE_EXIT_CODE : 0 (0x0)CHECKPOINT : 0x0WAIT_HINT : 0x0如果您在 PowerShell 中尝试同样的事,会得到: 代码如下:PS C:\& SC QUERY LANMANSERVERSet-Content : Access to the path 'C:\QUERY' is denied.At line:1 char:1+ SC QUERY LANMANSERVER+ ~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo : PermissionDenied: (C:\QUERY:String) [Set-Content], UnauthorizedAccessException+ FullyQualifiedErrorId : GetContentWriterUnauthorizedAccessError,Microsoft.PowerShell.Commands.SetContentCommand
因为 SC 是 Set-Content 的别名。它优先于 SC.EXE 文件。
方案 1A:使用 .EXE 扩展名
为了克服这个问题,您可以简单地将 .EXE 扩展名包含进旧命令。这消除了歧义并使相同的命令在 CMD.EXE 和 PowerShell 里都能用。还可以清楚告诉使用您脚本的人这里用的是旧 .EXE 命令而非 PowerShell 别名。
代码如下:PS C:\& SC.EXE QUERY LANMANSERVER
SERVICE_NAME: LANMANSERVERTYPE : 20 WIN32_SHARE_PROCESSSTATE : 4 RUNNING(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)WIN32_EXIT_CODE : 0 (0x0)SERVICE_EXIT_CODE : 0 (0x0)CHECKPOINT : 0x0WAIT_HINT : 0x0
方案 1B:使用 CMD /C
另一个办法是把您的命令用引号括起让 CMD.EXE 来运行。但这样做没啥效率,仅仅为了执行您的命令就得运行一个 CMD.EXE 实例。
代码如下:PS C:\& CMD /C "SC QUERY LANMANSERVER"
SERVICE_NAME: LANMANSERVERTYPE : 20 WIN32_SHARE_PROCESSSTATE : 4 RUNNING(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)WIN32_EXIT_CODE : 0 (0x0)SERVICE_EXIT_CODE : 0 (0x0)CHECKPOINT : 0x0WAIT_HINT : 0x0
方案 1C:用等效的 PowerShell
很多情况下,可以用 PowerShell cmdlet 来代替您的旧命令。例如这里您就可以直接使用 Get-Service: 代码如下:PS C:\& Get-Service LANMANSERVER | FL
Name : LANMANSERVERDisplayName : ServerStatus : RunningDependentServices : {Browser}ServicesDependedOn : {SamSS, Srv}CanPauseAndContinue : TrueCanShutdown : FalseCanStop : TrueServiceType : Win32ShareProcess
麻烦 2:PowerShell 的特殊字符
有时旧命令的参数使用的字符在 PowerShell 里有特殊意义。比如您想让某个目录被所有用户完全控制。在 CMD.EXE 里您可以这样做: 代码如下:C:\&ICACLS.EXE C:\TEST /GRANT USERS:(F)processed file: C:\TESTSuccessfully processed 1 Failed processing 0 files在 CMD.EXE 做这些没问题,但如果你在 PowerShell 运行就会报错: 代码如下:PS C:\& ICACLS.EXE C:\TEST /GRANT USERS:(F)The term 'F' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spellingof the name, or if a path was included, verify that the path is correct and try again.At line:1 char:34+ ICACLS.EXE C:\TEST /GRANT USERS:(F)+ ~+ CategoryInfo : ObjectNotFound: (F:String) [], CommandNotFoundException+ FullyQualifiedErrorId : CommandNotFoundExceptionn试图给名字以 $ 结尾的电脑对象授权时也会引起一个类似的错误。 代码如下:PS C:\& ICACLS.EXE C:\TEST /GRANT COMPUTERNAME$:(F)At line:1 char:39+ ICACLS.EXE C:\TEST /GRANT COMPUTERNAME$:(F)+ ~~Invalid variable reference. '$' was not followed by a valid variable name character. Consider using ${} to delimit thename.+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException+ FullyQualifiedErrorId : InvalidVariableReference
这个问题是因为括号和美元符在 PowerShell 中都有特殊意义。例如大括号之类常用字符也会引发相似的冲突。也有几种不同的方案来解决这个问题。
方案 2A:使用 CMD /C
和第一个问题一样,你可以引号括起您的命令交给 CMD.EXE 来处理。先不考虑效率,PowerShell 不会去解析引号里的字符串,这样就能正常工作。 代码如下:PS C:\& CMD.EXE /C "ICACLS.EXE C:\TEST /GRANT USERS:(F)"processed file: C:\TESTSuccessfully processed 1 Failed processing 0 files
方案 2B:使用 PowerShell 的转义字符
对于这个方案,您必须先知道使用的字符哪些对 PowerShell 有特殊意义。然后在它们每一个前面加上个反引号(`),它就是 PowerShell 的转义字符。这个方案的主要问题是你必须知道哪些字符需要转义,这让读写您的脚本更困难。我们的例子里,你需要处理 ( 和 ) 这两个字符: 代码如下:PS C:\& ICACLS.EXE C:\TEST /GRANT USERS:`(F`)processed file: C:\TESTSuccessfully processed 1 Failed processing 0 files方案 2C:使用 PowerShell v3 的新语法“–%”
在 PowerShell v3 中有另一种选择来解决这个问题。您只需在命令行的任意位置添加 –% 序列(两个短划线和一个百分号)PowerShell 就不会再去解析剩下的部分。我们的例子里,您可以这样用: 代码如下:PS C:\& ICACLS.EXE --% C:\TEST /GRANT USERS:(F)processed file: C:\TESTSuccessfully processed 1 Failed processing 0 files也可以这样用: 代码如下:PS C:\& ICACLS.EXE C:\TEST --% /GRANT USERS:(F)processed file: C:\TESTSuccessfully processed 1 Failed processing 0 files
方案 2D:使用等效的 PowerShell
使用等效的 PowerShell 也是种选择。ICACLS.EXE 可以用 Set-ACL 代替。可以从这篇博客中找到更多的 Set-ACL 例子。
混搭这里展示如何让您安全地享受 PowerShell 结合您的旧命令带来的灵活性。您可能会学到几个技巧并以全新的方式开始新老结合。
例如您能用灵活的 Get-Service 通配符代替 SC.EXE 里晦涩选项: 代码如下:Get-Service LAN* | % { $_.N SC.EXE SDSHOW $_.Name }或者您可以使用 PowerShell 的 Get-Item(别名 Dir)过滤文件子集传递给 ICACLS.EXE 来处理: 代码如下:DIR C:\TEST -Recurse | ? {$_.Length -ge 1MB} | % { ICACLS.EXE $_.FullName /Grant Administrator:`(F`) }您甚至可以循环遍历几个数并结合好用的 FSUTIL.EXE 来创建一批大小不同的文件用于测试项目: 代码如下:<div class="codebody" id="code20 | % { FSUTIL.EXE FILE CREATENEW C:\TEST\FILE$_.TXT ($_*10KB)尾声事到如今,您可能已经确信 Windows PowerShell 是管理员的好朋友啦。然而您可能因为有些旧命令带着古怪的名字或参数而不能使用 POWERSHELL.EXE。我非常鼓励您使用这些技巧来彻底停用 CMD.EXE 并永久迁移到 PowerShell 来作为您主要的 shell。文章出处:http://www.pstips.net/using-windows-powershell-to-run-old-command-line-tools-and-their-weirdest-parameters.html
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 cmd是什么 的文章

 

随机推荐