#batch-file #variables #math
#пакетный файл #переменные #математика
Вопрос:
Я пытался написать короткий скрипт в пакете, который преобразует две переменные в формате дроби (%a%, числитель и%b%, знаменатель) в процент (%c%)
пакетные переменные поддерживают только целые числа, поэтому я не могу использовать:
set /A c="%a% / %b% * 100"
Я слышал об обходных путях для этого с помощью сценариев .vbs (экспортируйте%a% и %b% в скрипт, попросите скрипт выполнить математические вычисления и импортировать результат обратно в пакет)
есть ли более простой способ сделать это? в частности, без использования внешнего скрипта (если это должен быть внешний скрипт, он должен быть временно создан в том же каталоге, что и .bat, а затем удален после выполнения его цели)
Я уверен, что это звучит как вопрос типа «сделай это для меня», но я нигде не могу найти ответ, если есть более простой способ сделать это, пожалуйста, помогите мне.
Комментарии:
1.
set /A
использует ли 32-разрядную целочисленную арифметику со знаком…2. @aschipfl хорошо, я знаю об этом, ‘set / A’ не поддерживает использование действительных чисел (десятичных дробей), поэтому выражение, которое я ввел, не будет работать из-за того, что первая операция (/) выдает десятичное число, которое всегда округляется в меньшую сторону, что означает, что если результат операции равен 1, он всегда будет равен 0. таким образом, C может быть только 0 или 100
Ответ №1:
Если вам нужны только целочисленные значения, вы можете изменить порядок выражения
set /A "c= (a*100) / b"
Для немного большей точности вы могли бы использовать
set /A "c= ( a*100 b/2 ) / b"
И если вам нужно несколько знаков после запятой, просто умножьте на большее значение
set /A "r= (a*10000) / b"
echo %r:~0,-2%.%r:~-2%
Ответ №2:
Выполнение математики с десятичными дробями — один из немногих случаев, когда я рекомендую использовать powershell в пакетном скрипте.
for /f "delims=" %%A in ('powershell %a%/%b%*100') do set "c=%%A"
Комментарии:
1. к сожалению, я, возможно, не смогу использовать PowerShell, я пишу этот скрипт на старой машине с воздушным зазором под управлением Windows XP pro (это долгая история), PowerShell не предустановлен до Windows 7.
2. Нет необходимости объяснять; я видел множество приложений в производственных средах, которые были несовместимы с Windows после XP.