删除/ F末尾的空格

时间:2013-02-14 13:03:31

标签: batch-file command dos

大家好我正在尝试在批处理文件中使用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"

在模型名称后留下一个空格。

有谁知道如何移除后面的空间?

4 个答案:

答案 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%"

这只删除最后一个字符