我正在创建一个标准的 Windows BAT/CMD 文件,并且我想创建一个 IF 语句来检查这个 CMD 文件是否是从 PowerShell 运行的。我怎样才能做到这一点?
编辑:我的根本问题是test.cmd "A=B"
导致%1==A=B
从 CMD运行但从 PowerShell 运行时%1==A
。%2==B
在这两种情况下,脚本本身实际上都是作为旧的 Windows 命令行脚本运行的,因此检查 Get-ChildItem 总是会产生错误。
我正在创建一个标准的 Windows BAT/CMD 文件,并且我想创建一个 IF 语句来检查这个 CMD 文件是否是从 PowerShell 运行的。我怎样才能做到这一点?
编辑:我的根本问题是test.cmd "A=B"
导致%1==A=B
从 CMD运行但从 PowerShell 运行时%1==A
。%2==B
在这两种情况下,脚本本身实际上都是作为旧的 Windows 命令行脚本运行的,因此检查 Get-ChildItem 总是会产生错误。
一种方法是查看您的进程名称,然后检查其属性:
title=test
tasklist /v /fo csv | findstr /i "test"
只要您使用唯一的名称代替 Test,就应该几乎没有出错的余地。
你会得到类似的东西:
"cmd.exe","15144","控制台","1","3,284 K","正在运行","GNCID6101\Athomsfere","0:00:00","test"
当我从 bat 文件运行上述代码时,我的输出是:
"powershell.exe","7396","控制台","1","50,972 K","正在运行","GNCID6101\Athomsfere","0:00:00","
一种可能对您有用的可能更简单的方法。如果没有,它可能适合其他人。
test.ps1
和test.cmd
<path>\test
(或者只是test
如果文件夹在路径环境变量中。.bat > .cmd
,而 Powershell 优先考虑:.ps1 > .bat > .cmd
。以下是 CMD 会话的输出:
C:\Temp>copy con test.cmd @echo cmd^Z 已复制 1 个文件。 C:\Temp>copy con test.ps1 写输出“ps1”^Z 已复制 1 个文件。 C:\温度>.\测试 命令 C:\温度>
test
并从 Powershell调用:
PS C:\Temp> .\test ps1 PS C:\温度>
您不能尝试执行 Get-ChildItem 然后检查 %ERRORLEVEL% 以查看它是否返回未找到的 exe?