BATCH:字符串中缺少终止符 '

BATCH:字符串中缺少终止符 '

我目前正在开发一个小批处理脚本,该脚本应该获取我的处理器信息(及其当前频率)以将它们打印在标准输出中。

我的问题是:当我尝试在 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;

相关内容