大家好我正在尝试在批处理文件中使用FOR /F
命令但是我遇到了问题。
我跑了....
rem finding model number
for /F "delims= skip=1 tokens=*" %%a in ('wmic csproduct get name') do if not defined model set model=%%a
它运作良好,我得到了我想要的结果
result: 637263G
现在假设我在c:\ windows \
下创建一个名为“637263G”的文件夹eg:c:\windows\637263G\test
我创建了一个批次去路径...
for /F "skip=1 tokens=*" %%a in ('wmic csproduct get name') do if not defined model set model=%%a
cd windows\%model%\test
................................
这种爆炸是因为%model%正在返回"c:\windows\637263G \test"
而不是"c:\windows\637263G\test"
在模型名称后留下一个空格。
有谁知道如何移除后面的空间?
答案 0 :(得分:3)
您可以使用替换来抑制%% a中的所有空格:
set a=%a: =%
答案 1 :(得分:3)
您不应该删除所有空格,正如一些答案所示,因为某些计算机的值中间有空格。请参阅List of WMIC CSProduct Get Name Results。
我不仅获得多个尾随空格,而且还得到一个尾随回车符(<CR>
),它是将WMIC的unicode输出自动转换为ASCII的工件。
可以通过将值传递到另一个FOR / F循环来删除尾随<CR>
。这也删除了幻像“空白”行(实际上是<CR>
),因此不再需要IF语句。
然后可以使用~nx
修饰符删除尾随空格。这是有效的,因为文件名不能以空格或点结尾,而是由操作系统自动删除。修饰符通过删除尾随点和空格来标准化“文件名”。如果值包含\
,/
,*
或?
,或者以字母后跟:
开头,则无法正常工作。
for /F "skip=1 delims=" %%A in (
'wmic csproduct get name'
) do for /f "delims=" %%B in ("%%A") do set "model=%%~nxB"
另一种选择是使用wmz的CSV格式建议,但我仍然需要删除尾随的<CR>
。
for /F "skip=2 tokens=2 delims=," %%A in (
'wmic csproduct get name /format:csv'
) do for /f "delims=" %%B in ("%%A") do set "model=%%B"
编辑 - 为什么wmz解决方案可能无法正常工作<CR>
<CR>
问题可能不明显,具体取决于您在model
变量设置后如何访问它。正常扩展将剥离任何<CR>
,但延迟扩展会保留它。
@echo off
setlocal enableDelayedExpansion
for /f "skip=2 tokens=2 delims=," %%A in (
'wmic csproduct get name /format:csv'
) do set "model=%%A"
echo Normal expansion strips ^<CR^>: [%model%]
echo Delayed expansion preserves ^<CR^>: [!model!]
--- OUTPUT ---
Normal expansion strips <CR>: [LX4710-01]
] Delayed expansion preserves <CR>: [LX4710-01
编辑 - 避免<CR>
问题的另一种方法
您可以使用CSV格式并请求在所需值之后显示的额外属性。当您解析出所需的令牌时,<CR>
将与额外值一起被丢弃。
for /f "skip=2 tokens=2 delims=," %%A in (
'wmic csproduct get name^,vendor /format:csv'
) do set "model=%%A"
答案 2 :(得分:2)
除了修剪返回字符串(如已建议)之外,您还可以重新格式化wmic输出,使其不返回填充(空格),例如:
for /f "skip=2 tokens=2 delims=," %%a in ('wmic csproduct get name /format:csv')
如果您想要返回超过1列,这是特别方便的 (它将按原样返回数据,因此如果它包含尾随空格,则会保留。如果要无条件地修剪空格,请使用变量替换)
答案 3 :(得分:1)
像Kayasax建议的那样,你可以使用变量替换 但这仅适用于普通变量,不适用于%1,也不适用于for循环参数。
set "model=%model: =%"
或者,如果你确定wmic总是附加一个空格,你也可以使用
set "model=%model:~0,-1%"
这只删除最后一个字符