Arrays 使用cmd创建一组文件夹-使用空格设置循环变量

Arrays 使用cmd创建一组文件夹-使用空格设置循环变量,arrays,batch-file,cmd,Arrays,Batch File,Cmd,我不知道是年龄还是缺乏实践。不管怎样,我都不能对这个问题掉以轻心。我试图设置一个子例程,但由于字符串3和4中的空格,我传递的字符串被拆分 SET SubA=String1,String2,String 3,String 4 FOR %%A IN (%SubA%) DO MD "%%A" 我试过在字符串周围加括号 微软说要使用的括号。我也试过下面这句话,但没有成功 setlocal enableDelayedExpansion For /F "tokens=* de

我不知道是年龄还是缺乏实践。不管怎样,我都不能对这个问题掉以轻心。我试图设置一个子例程,但由于字符串3和4中的空格,我传递的字符串被拆分

SET SubA=String1,String2,String 3,String 4
FOR %%A IN (%SubA%) DO MD "%%A"
我试过在字符串周围加括号 微软说要使用的括号。我也试过下面这句话,但没有成功

setlocal enableDelayedExpansion
For /F "tokens=* delims=" %%A  IN (%Var%) DO  MD "%%A"
此外,如果可能的话,我希望我能列出一个列表,可能有一个数组。就像在Power shell中一样,我可以做到这一点。我真的需要保持在同一批文件,以便用户可以编辑列表。我知道我可以使用插入符号,但越容易为我的客户使用,效果越好

$Folders (
String1
String2
String 3
String 4
)

编辑:我想要的结果是让这个脚本创建一组像图中那样的文件夹

创建目录的最简单方法可能是:

Set“SubA=String1、String2、string3、string4”
MD“%SubA:,=”“%”2>NUL

至于使用初始变量,并像使用数组一样使用它,您可以这样做:

@Echo Off&SetLocal EnableExtensions EnableDelayedExpansion
设置“SubA=String1、String2、string3、string4”
对于/F“Delims==”%%G In(”(设置索引[)2>NUL“),请设置“%%G=”
设置“i=0”
设置“索引[!i!]=%SubA:,=”&Set/A i+=1&Set“索引[!i!]=%
(设置索引[)2>编号和暂停(&P)
或者你可以这样做:

@Echo Off&SetLocal EnableExtensions EnableDelayedExpansion
设置“SubA=String1、String2、string3、string4”
对于/F“Delims==”%%G In(”(设置索引[)2>NUL“),请设置“%%G=”
设置“i=-1”
对于%%G In(“%SubA:,=”,“%”)Do(设置/A i+=1
设置“索引[!i!]=%%~G”)
(设置索引[)2>编号和暂停(&P)

如果Microsoft仍支持PowerShell,这里有另一种使用系统中已有的PowerShell创建目录的方法。当您确信将创建正确的目录时,请从
mkdir
命令中删除
-WhatIf

SET "SubA=String1,String2,String 3,String 4"
powershell -NoLogo -NoProfile -Command ^
    "'%SubA%'.split(',') | ForEach-Object { mkdir $_ -WhatIf | Out-Null }
一个更好的方法是在尝试创建目录之前测试它是否已经存在

SET "SubA=String1,String2,String 3,String 4"
powershell -NoLogo -NoProfile -Command ^
    "'%SubA%'.split(',') | ForEach-Object {" ^
        "if (-not (Test-Path -Path $_)) { mkdir $_ | Out-Null }" ^
    "}"

最简单的不需要欺骗的纯批处理文件解决方案是使用
来实现
枚举空间分隔令牌的能力

要使其按预期工作,本身包含空格的标记必须双引号:

@echo off & setlocal

:: Space-separated list of folder names, with names that contains
:: spaces themselves double-quoted.
SET SubA=String1 String2 "String 3" "String 4"

:: Loop over the list elements and create a directory for each.
FOR %%A IN (%SubA%) DO MD %%A
正如所暗示的,您实际上可以将此列表传递给单个调用
MD
MD%SubA%


不幸的是,据我所知,批处理文件并没有提供一种方便的方式来定义每行一项格式的列表

但是,您可以通过外部文件提供姓名列表,每个姓名都在自己的行中(无需双引号),然后可以使用
为/f
解析姓名列表;例如:

@echo off & setlocal

:: Determine the full path of the file "names.txt" 
:: located in the same folder as this batch file.
set "nameList=%~dp0names.txt"

:: Loop over all names in the file and call `md` with each.
for /f "usebackq delims=" %%n in ("%nameList%") do md "%%n"
然后输入文件
names.txt
将包含如下内容:

String1
String2
字符串3
字符串4

我不确定如何运行该程序。我已经运行了两个脚本,但它没有创建任何文件夹。我通过添加MD和从这里选择的变量对它进行了不同的修改,但我无法让它创建任何文件夹。@不,如果你不知道如何使用它的每个索引,我不确定你为什么提到数组。无论如何,当你我已经给出了一个非常基本的答案,就是如何创建目录,在每个逗号(而不是空格)处拆分变量。作为替代方案,您可以让Powershell为您处理提升:
Powershell-命令“'string1'、'string2'、'string3'、'string4'| Foreach Object-Process{New Item-Path C:\-Name$\-Type Directory}“
问题在于它是一个较大脚本的一部分,并且将这个小部分移动到ps无法工作。请(至少)引用“spacy”参数:
SET SubA=String1、String2、String 3、String 4”
并使用
md%%~a”
再次删除路径。@AbrahamZinala,如果他们可以重写它,他们没有理由不能这样做,首先,
设置“SubA=String1,String2,“String 3”,“String 4”“
,然后像这样为%%G in(%SubA%)创建目录,
执行MD%%G
;或者如Stephan所述,将它们全部双引号,
设置“SubA=”String1“、”String2“、”String 3“、”String 4“
,然后将
用于%%G In(%SubA%)执行MD“%%~G”
。不管怎样,这两种方法都没有我在回答中提到的方法那么简单。我仍然不知道我提供的一行代码会给他们带来什么问题。即使他们想为此创建一个单独的数组,它仍然是可能的:
Set Folders=string1,string2,“String 3”,“String 4”
。然后,
powershell-command”%Folders%| Foreach Object-Process{New Item-Path C:\-Name$\uType Directory}“
,它仍然是成批完成的,只是调用Posh来为您完成。