批量编码以通过带空格的文件夹进行管道传输
batch coding to pipe through folder with spaces
我目前正在尝试使用我的管理员帐户通过空间。我目前使用我的普通用户 ID,但我是 运行 批处理脚本作为管理员通过当前用户 ID 进行管道传输,但用户 ID 带有空格。我的用户 ID 是 johnny tan,如何才能将用户 ID 准确地回显给 johnny tan 而不是仅回显给 johnny?
for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set userid=%%j
echo %userid%
测试第三个标记是否为数字,如果不是,则表示它不是 ID 字段,因此它将同时使用元变量 %%j
和 %%k
。如果它是一个数字,则意味着它是 ID 字段,我们只使用 %%j
作为用户名。
@echo off
for /F "tokens=1-3*" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do (
echo %%k| findstr /vr "^[0-9][0-9]*$" >nul 2>&1 && set "userID=%%j %%k" || set "userID=%%j"
)
echo %userID%
将两个连续的SPACEs替换为用户ID中不应出现的字符(如|
),以此作为分隔符拆分字符串并删除可能领先的 SPACE 以提取用户 ID:
@echo off
rem // Capture the line of interest from the `qwinsta` command line:
for /F delims^=^ eol^= %%J in ('qwinsta /SERVER:%ComputerName% ^| findstr "^.console"') do (
rem // Store line, and toggle delayed expansion to avoid issues with `!`:
set "LINE=%%J" & setlocal EnableDelayedExpansion
rem /* Replace ` ` (two spaces) with `|`, assuming both do not occur in user IDs,
rem then extract the second token from the altered string, which is the user ID: */
for /F "tokens=2 delims=| eol=|" %%I in ("!LINE: =|!") do (
rem // Split off a potentially remaining leading ` ` (space):
endlocal & for /F "tokens=* eol= " %%H in ("%%I") do @set "userid=%%H"
)
)
set "userid"
这甚至适用于像 Johnny Fitzpatrick Tan
这样的用户 ID。
我目前正在尝试使用我的管理员帐户通过空间。我目前使用我的普通用户 ID,但我是 运行 批处理脚本作为管理员通过当前用户 ID 进行管道传输,但用户 ID 带有空格。我的用户 ID 是 johnny tan,如何才能将用户 ID 准确地回显给 johnny tan 而不是仅回显给 johnny?
for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set userid=%%j
echo %userid%
测试第三个标记是否为数字,如果不是,则表示它不是 ID 字段,因此它将同时使用元变量 %%j
和 %%k
。如果它是一个数字,则意味着它是 ID 字段,我们只使用 %%j
作为用户名。
@echo off
for /F "tokens=1-3*" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do (
echo %%k| findstr /vr "^[0-9][0-9]*$" >nul 2>&1 && set "userID=%%j %%k" || set "userID=%%j"
)
echo %userID%
将两个连续的SPACEs替换为用户ID中不应出现的字符(如|
),以此作为分隔符拆分字符串并删除可能领先的 SPACE 以提取用户 ID:
@echo off
rem // Capture the line of interest from the `qwinsta` command line:
for /F delims^=^ eol^= %%J in ('qwinsta /SERVER:%ComputerName% ^| findstr "^.console"') do (
rem // Store line, and toggle delayed expansion to avoid issues with `!`:
set "LINE=%%J" & setlocal EnableDelayedExpansion
rem /* Replace ` ` (two spaces) with `|`, assuming both do not occur in user IDs,
rem then extract the second token from the altered string, which is the user ID: */
for /F "tokens=2 delims=| eol=|" %%I in ("!LINE: =|!") do (
rem // Split off a potentially remaining leading ` ` (space):
endlocal & for /F "tokens=* eol= " %%H in ("%%I") do @set "userid=%%H"
)
)
set "userid"
这甚至适用于像 Johnny Fitzpatrick Tan
这样的用户 ID。