3

我需要以下方面的帮助;

我有以下脚本:

SETLOCAL DisableDelayedExpansion

for /f "delims=" %%a in (stores1.txt) do (

set /p stores=%%a )

stores.txt的内容如下:

0010
0011
0012
etc.

我找到的解决方案是set /p stores=%%a

此输出 :0010,0011,0012必须作为参数传递给sql.script:

sqlplus user/password@%database% @sqlscript.sql !stores! !data!

store必须是数值,因为在 .sql 脚本中会询问数值

所以结论是我需要一个数值而不是字符串。我该怎么做这个“转换”?

@echo off
setlocal enabledelayedexpansion
set stores=
PAUSE
for /f "delims=" %%a in (stores1.txt) do (
set /a stores=%%a
echo !stores!
)
pause
4

2 回答 2

6

基本上,@Bali C 是正确的。大多数情况下,任何值都是字符串值,cmd除非上下文要求或建议对其进行不同处理。例如,在算术表达式中,值将自动转换为/视为数字。

但是,批处理脚本中的数字可以用不止一种方式处理。特别是,根据数字以哪个字符开头,它可以被视为

  • 一个十六进制值(当它有前缀时0x);

  • 八进制值(以 a 开头时0);

  • 十进制值(在所有其他情况下)。

因此,如果您只是0010在预期数字的上下文中使用例如,该值将评估为8,因为0010它是八进制表示法中的数字,cmd并且8是其十进制等价物。这就是你会得到的,特别是,如果你只是这样做:

set /a stores=%%a

您可以使用以下简单技巧来摆脱前导 0(从而避免将该值视为八进制):

set /a "stores=1%%a %% 10000"

将 放在1开头会将其变为 5 位数字和十进制数字。找到除以 10000 的余数只返回原始数字,但现在去掉了前导 0。

(注意:实际的模运算符是%, not %%,但字符必须加倍,因为它在算术上下文之外的特殊含义。)

于 2013-01-25T18:03:28.207 回答
0

我不认为 cmd 处理数字与字符串不同,除非你用它们做算术。

我不确定它是否会有所不同,但您可以使用 为变量分配一个数字set /a,因此请尝试使用

set /a stores=%%a
于 2013-01-23T12:25:38.440 回答