我目前正在开发一个小批处理脚本,该脚本应该获取我的处理器信息(及其当前频率)以将它们打印在标准输出中。
我的问题是:当我尝试在 PowerShell 中或直接在 CMD 中执行命令时一切正常,但是当我尝试执行批处理文件时出现错误(我的计算机是法语的):
Le terminateur ' est manquant dans la chaîne.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
用英语来说就是这个意思:
The terminator ' is missing in the string.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
我尝试逐行运行我的代码,发现错误来自我测试计算机是否使用英文的那一行(因为计数器在法语和英语中的名字不同)。
我认为错误出在这行(更准确地说是'%',因为当我删除它时一切都正常):
$ProcessorPerformance = (Get-Counter -Counter '\Processor Information(_Total)\% Processor Performance' -ErrorAction:Ignore).CounterSamples.CookedValue;
我的代码:
powershell -Command "$ISlistOfProcessors = (Get-CimInstance CIM_Processor | Select-Object @{n='ProcessorModel';e={$_.Name}},Caption,DeviceID,CurrentClockSpeed,MaxClockSpeed,NumberOfCores,NumberOfLogicalProcessors); for($i=0; $i -lt $ISlistOfProcessors.Length+1; $i++){$ProcessorPerformance = (Get-Counter -Counter '\Processor Information(_Total)\% Processor Performance' -ErrorAction:Ignore).CounterSamples.CookedValue; if(!$ProcessorPerformance){$ProcessorPerformance = (Get-Counter -Counter '\Informations sur le processeur(_Total)\Pourcentage de performances du processeur').CounterSamples.CookedValue};$ISlistOfProcessors[$i].CurrentClockSpeed=[math]::Round($ISlistOfProcessors[$i].MaxClockSpeed*($ProcessorPerformance/100));} $ISlistOfProcessors"
pause
并且格式更易读(我只是做了一些返回行,并且我只执行上面的代码):
powershell -Command "
$ISlistOfProcessors = (Get-CimInstance CIM_Processor | Select-Object @{n='ProcessorModel';e={$_.Name}},Caption,DeviceID,CurrentClockSpeed,MaxClockSpeed,NumberOfCores,NumberOfLogicalProcessors);
for($i=0; $i -lt $ISlistOfProcessors.Length+1; $i++){
$ProcessorPerformance = (Get-Counter -Counter '\Processor Information(_Total)\% Processor Performance' -ErrorAction:Ignore).CounterSamples.CookedValue;
if(!$ProcessorPerformance){
$ProcessorPerformance = (Get-Counter -Counter '\Informations sur le processeur(_Total)\Pourcentage de performances du processeur').CounterSamples.CookedValue
}
$ISlistOfProcessors[$i].CurrentClockSpeed=[math]::Round($ISlistOfProcessors[$i].MaxClockSpeed*($ProcessorPerformance/100));
}
$ISlistOfProcessors"
pause
有人知道为什么只有当我运行批处理脚本时才会出现此错误吗?
谢谢您的帮助,抱歉我的英语不好(我是法国人)。
答案1
我在尝试将计数器的名称放入变量时找到了一个解决方案。
我的问题在于命令中的“%”,因为批处理文件肯定在搜索变量名。所以我只是用计数器的名称创建了一个变量:
set counterName='\Processor Information(_Total)\% Processor Performance'
powershell -Command "$ISlistOfProcessors = (Get-CimInstance CIM_Processor | Select-Object @{n='ProcessorModel';e={$_.Name}},Caption,DeviceID,CurrentClockSpeed,MaxClockSpeed,NumberOfCores,NumberOfLogicalProcessors); for($i=0; $i -lt $ISlistOfProcessors.Length+1; $i++){$ProcessorPerformance = (Get-Counter -Counter %counterName% -ErrorAction:Ignore).CounterSamples.CookedValue; if(!$ProcessorPerformance){$ProcessorPerformance = (Get-Counter -Counter '\Informations sur le processeur(_Total)\Pourcentage de performances du processeur').CounterSamples.CookedValue};$ISlistOfProcessors[$i].CurrentClockSpeed=[math]::Round($ISlistOfProcessors[$i].MaxClockSpeed*($ProcessorPerformance/100));}$ISlistOfProcessors"
事实上我只是替换了这一行:
$ProcessorPerformance = (Get-Counter -Counter '\Processor Information(_Total)\% Processor Performance' -ErrorAction:Ignore).CounterSamples.CookedValue;
通过这一行:
$ProcessorPerformance = (Get-Counter -Counter %counterName% -ErrorAction:Ignore).CounterSamples.CookedValue;