如何使此powershell命令在循环内成批工作?

如何使此powershell命令在循环内成批工作?,powershell,batch-file,Powershell,Batch File,试图找出区别。但是,当此powershell命令位于findstr中时,它将失败。它本身返回正确的值。此外,如果没有循环,它将返回正确的值 echo:!newvalue!| findstr /R "^[0123456789][0123456789]\.[0123456789]$" >nul if errorlevel 1 ( set newvalue= ) else ( FOR /F "usebackq delims=" %%i IN (`powershell -n

试图找出区别。但是,当此powershell命令位于findstr中时,它将失败。它本身返回正确的值。此外,如果没有循环,它将返回正确的值

echo:!newvalue!| findstr /R "^[0123456789][0123456789]\.[0123456789]$" >nul
  if errorlevel 1 (
    set newvalue=
  ) else (
    FOR /F "usebackq delims=" %%i IN (`powershell -nop -c "'{0:n1}' -f (%newvalue% - 12.0)"`) DO (SET difference=%%i)
    echo %difference%
  )
有人能找出我遗漏了什么/做错了什么吗

提前谢谢。

我推荐阅读

Windows command processor使用语法
%variable%
替换命令块内的所有环境变量引用,该命令块已在使用此命令块分析命令行时以
开始,以匹配的
结束)。
。这意味着在执行命令之前,
cmd.exe修改IF命令的
echo%difference%
内部的ELSE分支命令块的命令行
<代码>%difference%
替换为环境变量
difference
的当前值,如果环境变量
difference
未在IF条件上方的某个位置定义,则替换为空字符串。在后一种情况下,
echo
是解析命令块后剩余的命令行,因此显示命令回显的状态,而不是上面命令行中分配给环境变量
difference
的字符串值。已启用延迟环境变量扩展的解决方案使用的是
echo!不同ELSE命令块中编码>

不使用PowerShell的浮点减法解决方案如下所示:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
if defined NewValue goto Validate

:UserPrompt
set /P "NewValue=Enter value between 00.0 and 99.9: "

:Validate
echo:!NewValue!| %SystemRoot%\System32\findstr.exe /R "^[0123456789][0123456789]\.[0123456789]$" >nul
if errorlevel 1 set "NewValue=" & goto UserPrompt

for /F "tokens=1,2 delims=." %%I in ("%NewValue%") do set "PreComma=%%I" & set "PostComma=%%J"
set /A Difference=1%PreComma% - 112
set "Difference=%Difference%.%PostComma%"
echo Difference is: %Difference%
endlocal
验证分配给环境变量
NewValue
的字符串是否确实由两位数字、一个点和一个以上的数字组成(如请求、预期和所述)后,浮点数字字符串在
上拆分为逗号前和逗号后的数字字符串

使用算术表达式将逗号前的数字减去12。但必须考虑的是,在计算算术表达式时,
cmd.exe
将前导为0的整数解释为八进制数。对于
00
07
,这是没有问题的。但是
08
09
将是无效的八进制数,因此Windows命令处理器将使用值
0
,如果在批处理文件中仅使用
set/a Difference=PreComma-12
,则会导致错误的减法结果。解决方法是将字符串
1
与前逗号字符串连接到范围
100
199
的数字字符串,然后减去
112
,以获得正确的结果

逗号后的值不需要修改,因此通过将算术表达式的结果与未修改的逗号后的数字字符串连接起来,最终确定
差异

通过在回声差异为:%Difference%
上方插入以下附加命令行,也可以始终使用两位数字获取
差异值:

if %Difference:~0,1% == - (
    if %Difference:~2,1% == . set "Difference=-0%Difference:~1%"
) else (
    if %Difference:~1,1% == . set "Difference=0%Difference%"
)
此解决方案还避免了
PowerShell
的浮点结果根据区域和语言设置进行格式化的问题。例如,在德国和奥地利,十进制符号是
而不是
,这意味着PowerShell为
15.3-12.0
输出的减法结果是
3,3
而不是
3.3

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • echo/?
  • endlocal/?
  • findstr/?
  • 获取/?
  • goto/?
  • 如果/?
  • 设置/?
  • setlocal/?
另请参见。

我建议阅读

Windows command processor使用语法
%variable%
替换命令块内的所有环境变量引用,该命令块已在使用此命令块分析命令行时以
开始,以匹配的
结束)。
。这意味着在执行命令之前,
cmd.exe修改IF命令的
echo%difference%
内部的ELSE分支命令块的命令行
<代码>%difference%
替换为环境变量
difference
的当前值,如果环境变量
difference
未在IF条件上方的某个位置定义,则替换为空字符串。在后一种情况下,
echo
是解析命令块后剩余的命令行,因此显示命令回显的状态,而不是上面命令行中分配给环境变量
difference
的字符串值。已启用延迟环境变量扩展的解决方案使用的是
echo!不同ELSE命令块中编码>

不使用PowerShell的浮点减法解决方案如下所示:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
if defined NewValue goto Validate

:UserPrompt
set /P "NewValue=Enter value between 00.0 and 99.9: "

:Validate
echo:!NewValue!| %SystemRoot%\System32\findstr.exe /R "^[0123456789][0123456789]\.[0123456789]$" >nul
if errorlevel 1 set "NewValue=" & goto UserPrompt

for /F "tokens=1,2 delims=." %%I in ("%NewValue%") do set "PreComma=%%I" & set "PostComma=%%J"
set /A Difference=1%PreComma% - 112
set "Difference=%Difference%.%PostComma%"
echo Difference is: %Difference%
endlocal
验证分配给环境变量
NewValue
的字符串是否确实由两位数字、一个点和一个以上的数字组成(如请求、预期和所述)后,浮点数字字符串在
上拆分为逗号前和逗号后的数字字符串

使用算术表达式将逗号前的数字减去12。但必须考虑的是,在计算算术表达式时,
cmd.exe
将前导为0的整数解释为八进制数。对于
00
07
,这是没有问题的。但是
08
09
将是无效的八进制数,因此