首页 > 开发 > PowerShell > 正文

PowerShell中运行CMD命令的技巧总结(解决名称冲突和特殊字符等问

2020-05-30 20:10:51
字体:
来源:转载
供稿:网友

引言

我从老旧的 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: LANMANSERVER
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
如果您在 PowerShell 中尝试同样的事,会得到:
代码如下:
PS C:/> SC QUERY LANMANSERVER
Set-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: LANMANSERVER
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

方案 1B:使用 CMD /C

另一个办法是把您的命令用引号括起让 CMD.EXE 来运行。但这样做没啥效率,仅仅为了执行您的命令就得运行一个 CMD.EXE 实例。

代码如下:PS C:/> CMD /C "SC QUERY LANMANSERVER"

SERVICE_NAME: LANMANSERVER
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE, PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

方案 1C:用等效的 PowerShell

很多情况下,可以用 PowerShell cmdlet 来代替您的旧命令。
例如这里您就可以直接使用 Get-Service:
代码如下:
PS C:/> Get-Service LANMANSERVER | FL

Name : LANMANSERVER
DisplayName : Server
Status : Running
DependentServices : {Browser}
ServicesDependedOn : {SamSS, Srv}
CanPauseAndContinue : True
CanShutdown : False
CanStop : True
ServiceType : Win32ShareProcess


麻烦 2:PowerShell 的特殊字符

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表