4

大家好,我正在尝试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

4 回答 4

3

您不应该像某些答案所建议的那样删除所有空格,因为某些计算机在值的中间有空格。请参阅WMIC CSProduct 获取名称结果列表

我不仅得到多个尾随空格,而且还得到一个尾随回车符 ( <CR>),这是 WMIC 的 unicode 输出自动转换为 ASCII 的产物。

<CR>可以通过将值传递给另一个 FOR /F 循环来删除尾随。这也删除了幻影“空白”行(实际上是 a <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!]

- - 输出 - -

   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"
于 2013-02-15T01:23:54.757 回答
3

您可以使用替换来抑制 %%a 中的所有空间:

set a=%a: =%
于 2013-02-14T13:28:48.753 回答
2

除了修剪返回字符串(如前所述)之外,您还可以重新格式化 wmic 输出,使其不返回填充(空格),例如:

for /f "skip=2 tokens=2 delims=," %%a in ('wmic csproduct get name /format:csv')

如果您想返回超过 1 列,这将特别方便。
(它将按原样返回数据,因此如果包含尾随空格,它将被保留。如果要无条件修剪空格,请使用变量替换)

于 2013-02-14T19:24:14.540 回答
1

就像 Kayasax 建议的那样,您可以使用变量替换。
但这仅适用于普通变量,不适用于 %1 或 for 循环参数。

set "model=%model: =%"

或者,如果您确定 wmic 总是附加一个空格,您也可以使用

set "model=%model:~0,-1%"

这仅删除最后一个字符

于 2013-02-14T13:40:39.487 回答