我有一个批处理文件中的命令行程序。
我遇到问题的步骤如下:
这个是可以正常工作的:
假设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
有什么想法吗? 非常感谢您的帮助!
for /F ... in ('dir ...
循环处理的是文件名,而不是文件对象。因此,%%~dpi
总是返回当前工作目录,如果这样的文件不存在,则%%~ti
未定义。/S
开关对本地路径有帮助(目前不知道 UNC 的情况)。并且在特定文件名中存在潜在的前导空格时,请使用"delims="
而不是"tokens=*"
。虽然罕见但可能会出现... - JosefZ