【问题标题】:using UNC path in a For Loop in a batch file在批处理文件的 For 循环中使用 UNC 路径
【发布时间】:2015-05-08 00:10:40
【问题描述】:

我在批处理文件中有一个命令行程序。 我遇到问题的步骤如下: 这有效:

假设 echo %filestocopyfilter% 产生这个:
*.sc *.csv(已验证)

以下作品:

d:

cd d:\temp

for %%i in (%filestocopyfilter%) do (

 set FileName=%%i

 SET FTIME=%%~ti

)

这会生成所有以 .sc 或 .csv 结尾的文件名

问题是我需要一个 UNC 路径,例如\10.10.0.145\d$\temp

现在我不能再使用 d: 或 cd d:\temp 没有这些,UNC 路径在上面的 for 命令中不起作用。

我试图修改我在这个网站上找到的东西来得到这个:

for %%i in ('dir "\\10.10.0.145\d$\temp\%filestocopyfilter%" ') do (

 set FileName=%%i

 SET FTIME=%%~ti

)

失败了。

也试过了

for %%i in ('dir "\\10.10.0.145\d$\temp\*.sc" ') do (

 set FileName=%%i

 SET FTIME=%%~ti

)

这当然只会获取 *.sc 文件,但它也会失败。

任何想法表示赞赏。

顺便说一句,我必须使用 UNC 的原因是因为我正在使用 psexec 从另一台计算机运行此批处理文件。批处理文件在本地运行良好,但它不会看到像 q:\temp(其中 q 是 10.10.0.145)这样的映射盘符,因为它没有适当的权限。我确实发现,如果我断开批处理文件,然后使用登录凭据重新映射驱动器,它将起作用 - 但是在需要运行时断开并重新连接驱动器确实不好。

-修改 - 添加到原始问题 - 不适合 cmets -

首先感谢您的及时答复。 这让我有很多东西可以尝试。

注意:这些都是在批处理文件中运行,而不是直接在命令行中运行:

在这里,我尝试使用路径拆分每个过滤器 - 它不会崩溃,回显结果为空 FileName 并且 FTIME 为空白。 只要我先执行此操作,这同样适用于非 UNC 路径 (%driveletter% = d:) 和 (%sourcepathnoquotes% = d:\temp) ---------------------工作-----------

%driveletter%

cd %sourcepathnoquotes%

FOR %%i IN (*.csv *.sc) DO.....

-------------不起作用-------

FOR %%i IN (' "\10.10.0.11\d$\u1\static\source-erase*.csv" "\10.10.0.11\d$\u1\static\source-erase*.sc" ') 做 (

设置文件名=%%~dpi

SET FTIME=%%~ti

echo 文件名为 %FileName%

回显文件时间为 %FTIME%

)

暂停

我遇到问题的另一个相关领域是 WMIC

假设 %sourcepathdoubleslashnoquotes% = \10.10.0.11\d$\u1\static\source-erase

假设 %FileName% = myfile.sc

wmic datafile where name="%sourcepathdoubleslashnoquotes%%FileName%" get lastmodified > "%tmpfilepathnoquotesnodouble%tmpFile.txt"

这适用于非 UNC 路径

键入“%tmpfilepathnoquotesnodouble%tmpFile.txt”| findstr /v LastModified > "%tmpfilepathnoquotesnodouble%tmpFile2.txt"

set /p myvar=

del "%tmpfilepathnoquotesnodouble%tmpFile.txt"

del "%tmpfilepathnoquotesnodouble%tmpFile2.txt"

注意:我之所以写到 tmpFile.txt 和 tmpFile2.txt 是因为 WMIC 命令的结果是两行:

最后修改时间

20150505172747.167788-240

我只需要变量中的第二行 - 如果不先写入文件,我似乎无法将命令的第二行输出到变量中

关于 Pushd:它确实有效,但我有两个问题。

1) 我还需要报告文件名。它目前只报告 MMDDYYY HH:MM:SS AM/PM

2) 使用 WMIC 的时间戳会更容易,见上文。

3) 似乎无法让它填充变量以便我可以解析和操作

推送“\computer.example.com\d$\temp\” forfiles -m *.csv -c "cmd /c echo @fdate @ftime" 弹出

想法? 提前非常感谢!

【问题讨论】:

    标签: batch-file for-loop command-line


    【解决方案1】:

    pushdpopd 将在这里为您提供帮助。他们将目录推送到堆栈上并更改为该目录,然后您可以弹回之前的位置。巧妙的技巧是,他们在幕后为您保留了 UNC 路径的驱动器号(当我尝试时,他们分配了“Z”驱动器)。看看下面的例子:

    pushd "\\computer.example.com\d$\temp\"
    forfiles -m *.csv -c "cmd /c echo @fdate @ftime"
    popd
    

    【讨论】:

    • 你试过了吗?问题是for /F ... in ('dir ... 循环处理文件names,而不是文件objects。因此,%%~dpi 始终返回当前工作目录,如果此类文件不存在,则不会定义 %%~ti/S 开关有助于本地路径(目前不知道 UNCs 怎么样)。并使用"delims=" 而不是"tokens=*" 作为特定文件名中潜在的前导空格。罕见但可能......
    【解决方案2】:
    For %A in (\\serenity\C$\*.bat \\serenity\C$\*.txt) do echo %A
    

    如果您使用多个文件规范,则必须为使用它们的所有命令指定每个文件的完整路径,例如 fordirdel

    此外,C$ 仅对管理员可用。所以你必须被提升才能使用它。

    使用此命令 CD 到 UNC 文件夹

    开启这样做的能力

    reg add "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v DisableUNCCheck /t REG_DWORD /d 1 /f
    

    然后

    start "" /d \\serenity\C$ "cmd"
    

    start "" /b /d \\serenity\C$ "cmd"
    

    【讨论】:

      【解决方案3】:

      试试

      pushd "\\10.10.0.145\d$\temp"
      

      然后使用您的(本地工作的)脚本。 Command-Line Reference:

      如果您指定网络路径,pushd 命令会临时分配 指定的最高未使用驱动器号(以Z: 开头) 网络资源。该命令然后更改当前驱动器和 目录到新分配的驱动器上的指定目录。如果 您使用启用了命令扩展的popd 命令,popd 命令删除由pushd 创建的驱动器号分配。

      对不起,如果它无法通过psexec 工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-29
        • 2016-07-30
        • 2015-09-13
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多