批量编码以通过带空格的文件夹进行管道传输

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。