如何从cmd.exe执行powershell命令(而不是从ps1文件中执行)

5

我想从cmd中执行PowerShell if-else语句。例如,要检查D:驱动器中名称中带有“temp”的文件数量,我使用了以下命令:

if(($i=ls D:\* | findstr /sinc:Temp).count -ne 0 ) {Write-Host $i}

这在Windows下的PowerShell中可以正常工作。

但是如果想从cmd(命令提示符)执行相同的操作,我该怎么做? 我尝试过

powershell -noexit if(($i=ls D:\* | findstr /sinc:Temp).count -ne 0 ) {Write-Host $i}

很遗憾,这并没有起作用。

5个回答

16

只需将命令用双引号括起来:

powershell "if(($i=ls D:\* | findstr /sinc:Temp).count -ne 0 ) {Write-Host $i}"

我也认为这里不需要使用- NoExit开关。该开关会在运行命令后防止powershell退出。如果你想返回到cmd,请删除此开关。

我认为此处不需要使用-NoExit开关。该开关会阻止 PowerShell 在运行命令后退出。如果你想回到cmd,请删除此开关。


这是问题的正确答案。应该标记为正确。 - villamejia
@utapyngo 如果我们需要以管理员身份运行这个程序,有没有相应的参数? - Harish Kumar

1
我知道这不是如何运行命令的答案(其他人已经涵盖了它),但为什么你想要结合cmd和powershell,当两者都可以单独完成工作呢?
例如powershell:
#Get all files on D: drive with temp in FILEname(doesn't check if a foldername was temp)
Get-ChildItem D:\ -Recurse -Filter *temp* | where { !$_.PSIsContainer } | foreach { $_.fullname }

#Check if fullpath includes "temp" (if folder in path includes temp, all files beneath are shown)
Get-ChildItem D:\ -Recurse | where { !$_.PSIsContainer -and $_.FullName -like "*temp*" } | foreach { $_.fullname }

Ex cmd:

#Get all files with "temp" in filename
dir d:\*temp* /s /a:-d /b

1

如果您不想使用PowerShell,这里有另一种解决方案:

dir /b D:\*Temp* | find /v /c "::"

这将仅打印名称中带有“Temp”的D盘文件或文件夹的数量。这里的双冒号只是一个字符串,不应出现在dir /b的输出中,因此find /v /c "::"计算dir /b输出的所有行数。

0

@utapyngo的双引号解决方案可行。

@utapyngo还有另外一种在cmd中实现的方法:

dir /b D:\* | find /c "*Temp*"

对于Bill:在你的第一段代码中,应该没有开头的双引号,我猜测是这样的吗?

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接