为什么使用“ Cmd / c Powershell”而不是“ Powershell”?


25

我已经按照问题中给出的说明使用注册表添加了我的第一个上下文菜单(是的)。

我最初使用它作为它执行的命令,即“ command”键的值:

Cmd /C Powershell  "imageSeqView --% \"%1\""

ImageSeqView是我的powershell函数的名称,我将其导入我的powershell配置文件中。它工作正常,但我想知道:为什么使用cmdopen Powershell来执行功能?这样做会不会更简单

Powershell  "imageSeqView --% \"%1\""

该命令似乎很好用,但是由于使用起来似乎很规范,cmd所以我想知道这是在暗中杀死幼犬吗?

在此处输入图片说明


2
所链接的问题中使用cmd /c... 的答案都没有cmd /k太大不同,因为命令完成后它将使窗口保持打开状态。推定者大概是这样做的,因此他们可以看到输出以进行调试。
鲍勃

1
它并不是我想知道的修饰符,而是它的使用cmd,这在我的研究中似乎无处不在。
stib

您能否提供cmd /c powershell具体建议的参考?同样,您链接的人没有这样的建议。
鲍勃(Bob)


3
猜测可能主要是货物养殖。在某些情况下,这可能是需要的(即,当您要使用管道等cmd构造时),但是当您无论如何都可以在Powershell中执行此操作时,它们实际上并不适用。尽管有关文件关联的文档很少,但MSDN文档中没有任何内容表明这是必要的。
鲍勃(Bob)

Answers:


29

没有充分的理由这样做。实际上,发生的唯一实际影响是放慢速度。

人们可能会认为这样做有充分的理由。使用CMD具有以下效果,在某些情况下通常会很不错:

  • 启用内部命令,例如“ DIR
  • 设置环境变量,例如PATH变量

但是,在这种情况下,这些收益都无法获得。让我们看一下这两种情况:

因此,在某些情况下,有时会使用“ CMD /C”很有用。例如,如果我使用外部命令PSEXEC(从SysInternals下载),并尝试DIR在远程计算机上运行“ ”,则Windows将尝试运行“ DIR”命令。Windows将无法运行该命令,因为不存在以另一个受支持的扩展名结尾的“ DIR.EXE”,“ DIR.BAT”或“ DIR”文件。(可以通过运行“ ECHO %PATHEXT%” 来查看支持的扩展名。)

但是,在这种情况下,如果我尝试运行“ CMD /C DIR”,那将起作用,因为Windows将查找名为“ CMD” 的可执行文件,并找到该可执行文件,然后CMD最终成功运行DIR内部的“ ”命令。 “ CMD”命令的一部分。

在这种情况下,您可以powershell像“ CMD /C powershell” 一样轻松地运行,因此不会从不必要的“ CMD /C”中受益。我看到要执行额外的键入“ CMD /C” 步骤的唯一好处是提供了一个示例,如果有人决定尝试修改示例以运行命令行“ DIR”或“ COPY”,该示例将非常有用。有一个更灵活的例子可能对某些人有用。当人们知道自己在做什么时,实际上并不需要它。

至于我提供的第二个要点,即设置环境变量,这也是您在这种特殊情况下不积极进行的事情。也许有人认为通过设置PATH环境变量来帮助解决问题。但是,当您直接运行命令时(例如,从“开始”菜单的“运行”菜单选项),Windows操作系统可能会在某些其他位置查找命令。例如,在Windows XP /更高版本中,您可以运行:

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths"

如果要运行的命令在“应用程序路径”下列出,则Windows可能会找到该程序,即使该程序不在路径中也是如此。因此,Windows所能找到的甚至比CMD在CMD使用的路径中所能找到的更多。

一个可能的好处是,如果您希望运行CMD,以便可以引用%USERPROFILE%或%LOGONSERVER%或%TEMP%/%TMP%之类的环境变量,但是由于您没有这样做,所以您不必这样做需要运行“ CMD /C”。

因此,对于您的特殊情况:没有充分的理由这样做。您所获得的效果是使计算机能够做更多的工作,减慢处理速度并消耗更多的内存(在现代设备上,所有这些工作量都可以忽略不计)。


我完全同意鲍勃的建议。鲍勃(Bob)带领您走上了正确的道路。不过,在阅读内容时,我认为一些更多的信息可能有助于快速地使内容更加清晰。
TOOGAM

2
ftr-使用不同优先级启动进程是一个很好的用例cmd /c。有点像cmd /c start /low Notepad.exe
Lieven Keersmaekers

好答案。我要提到的一件事是,它也运行cmd的autorun,但是通常没有设置,即使设置了它,在文件关联中也可能不需要。Lieven提出了优先权,尽管我认为文件关联还是有点奇怪。
鲍勃(Bob)

1
cmd本身不会设置环境变量。环境是从父进程继承的,在两者之间添加cmd不会对此进行任何更改。据我所知,App Paths仅用于ShellExecute,而不用于CreateProcess,因此在大多数情况下(尤其是在Shell中),这些将不适用(您可以自己尝试,pbrushmspaint适用于该应用程序的App Path,并且无法在其中使用)许多地方)。
乔伊(Joey)

@Joey也许更正确地说它可以扩展变量...但是,考虑一下,如果您使用它,REG_EXPAND_SZ可以扩展环境变量(使用相同的%syntax%)而无需调用cmd。文件关联中使用的动词是通过调用的ShellExecuteEx,因此应用路径确实适用于此。
鲍勃(Bob)

18

因为它消除了着色。

可能是他们认为人们发现蓝色背景分散了人们的注意力。


1
没有Windows,但是您不能仅在控制台属性中设置背景颜色吗?
Ruslan

1
尽管我的答案是竞争性的,但这表明没有理由。因为,这是一个明智的原因。做得好。当然,有些人可能会发现黑匣子比蓝匣子更让人分心。但是,这是个人喜好问题,人们可能会有不同的喜好,因此,+ 1是一个好的准确答案。@俄罗斯:是的,但是您可以在快速程序消失之前设法进行更改吗?(而且,您知道对一个会话进行的更改是否会影响其他会话。一般情况和特定情况(例如桌面图标)之间的设置是否会有所不同?)
TOOGAM

我从来没有注意到它,因为我使用conEmu作为默认控制台,这意味着我总是得到配置良好的控制台窗口(带有ascii艺术和自定义提示以及火把的gif图像。加载时间
还不

1

使用cmd powershell,您要求当前的外壳资源管理器调用参数powershell, "imageSeqView ..."解析为%1到cmd的cmd。

在这种情况下,"powershell"cmd应该是cmd命令,exe或cmd支持的脚本之一,例如bat。

使用powershell "imageSeqView ...",您要求当前的外壳资源管理器使用解析值为%1的powershell参数调用imageSeqView ...powershell。

在这种情况下,imageSeqViewpowershell希望将“ ”用作cmdlet,exe或powershell脚本。

假设“ imageSeqView”是powershell函数,则第一种方法完全没有必要,并且会稍微降低性能。

对于命令窗口选项,powershell中有类似的选项,例如-NoExit,应与cmd中的/ K相同。

对于管道内衬,初始化环境变量,powershell可以同样地完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.