【问题标题】:Iterating through output from 'dir' concatenates User and Folder name遍历“dir”的输出连接用户和文件夹名称
【发布时间】:2015-05-28 17:38:14
【问题描述】:

以下循环并不总是只生成创建者用户。很多时候,它将用户与文件夹连接起来。我不知道这是否是批次的某种限制还是我遗漏了什么

for /f "tokens=5,* SKIP=4" %%b IN ('dir "%folder%" /Q /TW /AD') do (
    ECHO User: %%b
)

大约 90-95% 的时间它给了我用户,但其他时候它给了我 user_folder

User: AAAAAAAAAADEV\iasimo_dFLD001_FLD001
  • FLD001_FLD001 是文件夹名称
  • AAAAAAAAAADEV\iasimo_d 是用户

【问题讨论】:

    标签: batch-file cmd directory


    【解决方案1】:

    很可能是因为 dir 列的大小是固定的。 建议您使用另一种方法

    1)WMIC:

    @echo off
    
    set "folder=C:\Windows\System32"
    
    for /f "tokens=* delims=" %%a in ("%folder%") do (
         set "fpath=%%~pa"
         set "fname=%%~na"
         set "fdrive=%%~da"
    )
    
    set "fpath=%fpath:\=\\%"
    
    for /f "usebackq tokens=* delims=" %%a in (`wmic path Win32_Directory where "path='%fpath%' and drive='%fdrive%' and filename='%fname%'" get  CSName /format:value`) do (
        for /f "tokens=* delims=" %%z in  ("%%a") do (
    
            if "%%z" neq "" (
                set "%%z"
            )
        )
    )
    
    echo %CSName%
    

    2) tooltipInfo.bat.要获得文件夹/文件所有者,您需要使用 10 个“幻数”(10 是所有者,174 是创建者):

    call tooltipInfo.bat "c:\something" 10
    

    你应该给你这样的输出:

    c:\something :
    pc\user
    

    还有其他可能的方法。

    【讨论】:

    • 我尝试过 #1 - 但我遇到了问题。我正在查看的文件夹位于共享网络上(因此来自资源管理器的地址将是 \\server01\z\blabla)这会改变 wmic 查询吗? (抱歉,这是我第一次使用 wmic - 以前从未使用过)对于 number2,我认为这是我最后的手段,我想限制我的批处理脚本之外的外部脚本数量,并且我已经在使用外部 vb脚本(我可能只需要使用这个)
    • @StanM 先尝试使用net use 命令映射网络文件夹
    • 此工具也将在其他网络上的其他计算机上运行,​​并且他们可能无权在这些计算机上进行新的映射。我刚刚发布了一种不同的方式,看起来它对我有用(虽然我要保存 tooltipInfo.bat 以防万一,这看起来真的很有用)
    【解决方案2】:
    for /f "tokens=4 SKIP=4" %%b IN ('dir "%folder%" /Q /TW /AD') do (
        ECHO User: %%b
    )
    

    这适用于我的系统(其中用户是第 4 列)。

    编辑:在 Win 7 和 Win 8.1 中测试

    【讨论】:

    • 我猜您的域/用户很可能很短,我只看到过较长的域/用户名会发生这种情况
    • 你是对的。很短。您是否尝试过在 tokens=5,* 中不使用 ,*
    • 这可能意味着名称和用户之间没有分隔符(即空格),因此,FOR 逻辑“认为”那里只有一个标记(用户和文件夹) 这就是它返回的内容。所以。用户名的大小可能在这里“责备”(可以这么说)。
    【解决方案3】:

    所以我最终做了一个更笨的方法 - 似乎用户列是 22 个字符,每当域/用户名命中时,我就会遇到这个问题。我通过将用户名之后的所有内容作为单个标记来解决它,然后将第 22 个字符之后的所有内容都砍掉(下面的代码是获取文件夹名称 - 基本上是一样的,但我需要两者,所以这就是我得到它的方式)。

    for /f "tokens=1-4,* SKIP=4" %%b IN ('dir "%%a" /Q /TW /AD') do (
            set _folder=%%f
            SET _folder=!_folder:~23!
    ) 
    

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多