在批处理文件中使用UNC路径进行For循环

3

我有一个批处理文件中的命令行程序。

我遇到问题的步骤如下:

这个是可以正常工作的:

假设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 了,如果没有这些,在上面的 for 命令中 UNC 路径无法工作。

我尝试修改了在该网站上找到的某些内容,以获取以下内容:

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),因为它没有适当的权限。我发现如果批处理文件断开连接,然后使用登录凭据重新映射驱动器,它将起作用 - 但是,在运行此程序时断开和重新连接驱动器确实不好。
-修改-添加到原始问题中-不适合评论-
首先感谢您的快速回答。这给了我很多要尝试的事情。
注意:这些都在批处理文件中运行而不是直接在命令行中:
在这里,我尝试将每个过滤器与路径分开 - 它不会崩溃,但echo结果为空FileName和FTIME为空。再次说明,只要我首先执行此操作(%driveletter%=d:)和(%sourcepathnoquotes%=d:\temp),就可以使用非UNC路径。
---------------------工作-----------------------
%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"') DO (
set FileName=%%~dpi
SET FTIME=%%~ti
echo the file name is %FileName%
echo the file time is %FTIME%
) pause 我遇到麻烦的另一个相关领域是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路径上运作
type "%tmpfilepathnoquotesnodouble%tmpFile.txt" | findstr /v LastModified > "%tmpfilepathnoquotesnodouble%tmpFile2.txt"
set /p myvar= < "%tmpfilepathnoquotesnodouble%tmpFile2.txt"
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)似乎无法将其填充到变量中以便进行解析和操作。

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

有什么想法吗? 非常感谢您的帮助!

3个回答

3

pushdpopd 可以帮助你。它们将目录推送到堆栈中并切换到该目录,然后可以弹回您之前所在的位置。巧妙的技巧是,在幕后为UNC路径预留了一个驱动器号(当我尝试时,它们分配了“Z”驱动器)。请看下面的示例:

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

你试过了吗?问题在于 for /F ... in ('dir ... 循环处理的是文件,而不是文件对象。因此,%%~dpi 总是返回当前工作目录,如果这样的文件不存在,则 %%~ti 未定义。 /S 开关对本地路径有帮助(目前不知道 UNC 的情况)。并且在特定文件名中存在潜在的前导空格时,请使用 "delims=" 而不是 "tokens=*"。虽然罕见但可能会出现... - JosefZ

0
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"

0

尝试一下

pushd "\\10.10.0.145\d$\temp"

然后使用您的(本地工作)脚本。根据命令行参考

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

如果无法通过psexec运行,请见谅。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接