Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在批处理文件中,我希望将变量(字符串)与设置模式进行比较,并返回一个数值_Batch File_Cmd - Fatal编程技术网

Batch file 在批处理文件中,我希望将变量(字符串)与设置模式进行比较,并返回一个数值

Batch file 在批处理文件中,我希望将变量(字符串)与设置模式进行比较,并返回一个数值,batch-file,cmd,Batch File,Cmd,我对编程有点陌生,我决定尝试制作一个交互式表单,为我在学校的sql课堂创建一个平面文件数据库,可以通过设置的任务加载到sql server中 我有一个.txt文件,它是数据库的平面文件 以平面文件为例,每个列之间用分隔符分隔;下线为: ID;FName;LName;FavColor;Gender: 1;Scott;Muhlestein;Silver;Male: 我已将文件内容导入内存,每一行都是不同的%var#%,我想将%var1%(作为数据库的标题)与如下所示的模式进行比较: A#C=任

我对编程有点陌生,我决定尝试制作一个交互式表单,为我在学校的sql课堂创建一个平面文件数据库,可以通过设置的任务加载到sql server中

我有一个.txt文件,它是数据库的平面文件

以平面文件为例,每个列之间用分隔符分隔;下线为:

ID;FName;LName;FavColor;Gender: 
1;Scott;Muhlestein;Silver;Male: 
我已将文件内容导入内存,每一行都是不同的%var#%,我想将%var1%(作为数据库的标题)与如下所示的模式进行比较:

A#C=任意字符

if %var1%==(A#C);(A#C);(A#C);(A#C): set colnum=4
if %var1%==(A#C);(A#C);(A#C): set colnum=3
if %var1%==(A#C);(A#C): set colnum=2
当前最大colnum=10

模式是以分号分隔并以冒号结尾的任意数量的字符

一旦我有了这个新变量(colnum),我就可以在用户尝试添加新记录时将条目数限制为正确的数量


有什么想法或它们是更好的方法吗?

除了计数检查之外,您甚至可以使用
findstr
进行语法检查:

echo %var#%|findstr /i "[0-9]*;[a-z]*;[a-z]*;[a-z]*:$" >nul &&echo correct||echo sorry, wrong Input
检查是否有数字,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟一串字母,后跟冒号,后跟“字符串末尾”

稍微适应“Müller”(除26个字母外)或“Brown Smith”(破折号)或“Mc Scott”(空格)等名字

一些黑暗的东西可能是对的,我误解了这个问题

如果只需要列数:

set "colnum="
for %%i in (%var#%) do set /a colnum +=1
echo number of entries: %colnum% 
if "%var#:~-1%" neq ":" echo you forgot the colon

除了计数检查之外,您甚至可以使用
findstr
进行语法检查:

echo %var#%|findstr /i "[0-9]*;[a-z]*;[a-z]*;[a-z]*:$" >nul &&echo correct||echo sorry, wrong Input
检查是否有数字,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟分号,后跟一串字母,后跟一串字母,后跟冒号,后跟“字符串末尾”

稍微适应“Müller”(除26个字母外)或“Brown Smith”(破折号)或“Mc Scott”(空格)等名字

一些黑暗的东西可能是对的,我误解了这个问题

如果只需要列数:

set "colnum="
for %%i in (%var#%) do set /a colnum +=1
echo number of entries: %colnum% 
if "%var#:~-1%" neq ":" echo you forgot the colon
@ECHO关闭
SETLOCAL
对于%%a IN(
“(A#C);(A#C);(A#C);(A#C):”
“(A#C);(A#C);(A#C):”
“(A#C);(A#C):”
“(A#C);(A#C):”
(A#C);(A#C);(A#C);(A#C)注意不要用冒号结尾
)设置“var=%%~a”&调用:countcols
后藤:EOF
:countcols
设置“workvar=”
设置/a计数=0
如果“%var:~-1%”=(
设置“workvar=%var%”
设置/a计数=1
)
:countloop
如果定义了workvar(
如果“%workvar:~0,1%”设置/a计数+=1
设置“workvar=%workvar:~1%”
转到计数环
)
回显“%var%”包含%count%列
后藤:EOF
这里有一个小演示

第一部分简单地将
var
设置为其中一个字符串(
~
删除包含的引号)并执行
countcols
子例程

countcols
首先确保
workvar
被“设置”为空,并且
count
被设置为
0

然后,如果
var
的最后一个字符是冒号,则将
workvar
设置为
var
的值,并将
count
设置为1

然后,如果定义了
workvar
,它将检查第一个字符,如果是分号,则计数1。然后,它将删除第一个字符

重复此操作直到
workvar
为空(因此未定义)

然后创建一个报告作为演示

有关批处理子字符串的详细信息,请参见

set /?
从提示符处。

@ECHO OFF
@echo off
setlocal

rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt

rem Count the number of fields separated by ; (or space, comma or equal-sign)
set colnum=0
for %%a in (%var1%) do set /A colnum+=1

echo colnum = %colnum%
SETLOCAL 对于%%a IN( “(A#C);(A#C);(A#C);(A#C):” “(A#C);(A#C);(A#C):” “(A#C);(A#C):” “(A#C);(A#C):” (A#C);(A#C);(A#C);(A#C)注意不要用冒号结尾 )设置“var=%%~a”&调用:countcols 后藤:EOF :countcols 设置“workvar=” 设置/a计数=0 如果“%var:~-1%”=( 设置“workvar=%var%” 设置/a计数=1 ) :countloop 如果定义了workvar( 如果“%workvar:~0,1%”设置/a计数+=1 设置“workvar=%workvar:~1%” 转到计数环 ) 回显“%var%”包含%count%列 后藤:EOF
这里有一个小演示

第一部分简单地将
var
设置为其中一个字符串(
~
删除包含的引号)并执行
countcols
子例程

countcols
首先确保
workvar
被“设置”为空,并且
count
被设置为
0

然后,如果
var
的最后一个字符是冒号,则将
workvar
设置为
var
的值,并将
count
设置为1

然后,如果定义了
workvar
,它将检查第一个字符,如果是分号,则计数1。然后,它将删除第一个字符

重复此操作直到
workvar
为空(因此未定义)

然后创建一个报告作为演示

有关批处理子字符串的详细信息,请参见

set /?
从提示中

@echo off
setlocal

rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt

rem Count the number of fields separated by ; (or space, comma or equal-sign)
set colnum=0
for %%a in (%var1%) do set /A colnum+=1

echo colnum = %colnum%
编辑:添加新方法

如果任何标题包含通配符,则上一个技巧将失败:
*?
。下面的解决方案允许在标题中使用特殊字符和通配符:

@echo off
setlocal EnableDelayedExpansion

rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt

rem Set maximum number of columns
set maxColnum=10

rem Count the number of fields separated by semicolon;
rem the fields may include other separators and wild-cards
set "str=%var1%;"
set colnum=0
for /L %%i in (1,1,%maxColnum%) do if defined str (
   set /A colnum+=1
   set "str=!str:*;=!"
)
echo colnum = %colnum%
@echo关闭
setlocal EnableDelayedExpansion
rem将第一行导入“var1”变量(您已经这样做了)
设置/P“var1=“
编辑:添加新方法

如果任何标题包含通配符,则上一个技巧将失败:
*?
。下面的解决方案允许在标题中使用特殊字符和通配符:

@echo off
setlocal EnableDelayedExpansion

rem Import first line into "var1" variable (you did this already)
set /P "var1=" < test.txt

rem Set maximum number of columns
set maxColnum=10

rem Count the number of fields separated by semicolon;
rem the fields may include other separators and wild-cards
set "str=%var1%;"
set colnum=0
for /L %%i in (1,1,%maxColnum%) do if defined str (
   set /A colnum+=1
   set "str=!str:*;=!"
)
echo colnum = %colnum%
@echo关闭
setlocal EnableDelayedExpansion
rem将第一行导入“var1”变量(您已经这样做了)
设置/P“var1=“