从UNC拖放到批处理文件 - 如何捕获%cd%

时间:2015-01-22 23:29:29

标签: windows batch-file

我有一个批处理文件:

@ECHO OFF
Set dd=%DATE:~0,2%
Set mm=%DATE:~3,2%
Set yyyy=%DATE:~6,4%
Set hh=%TIME:~0,2%
Set ii=%TIME:~3,2%
Set ss=%TIME:~6,2%
Set zipFileHandle=%yyyy%-%mm%-%dd%-%hh%-%ii%-%ss%
Set files=%*

%~dp0\7za a -t7z %cd%\%zipFileHandle%.7z %files%

当我删除一组文件和/或目录时,它会将它们压缩成一个过时的.7z文件,它们都来自它们。

问题是如果我删除网络文件,路径以\\开头,批处理文件会将保存目录的值更改为C:\Windows

如何在 %cd%将其更改为系统根目录之前获取cmd 的值?

如果不可能,是否可以从变量%files%获取公共根文件夹?

2 个答案:

答案 0 :(得分:0)

您应该收到下一条消息:

'\\computer\path'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.

所以你可以使用下一个:

%~dp07za a -t7z %~dp1%zipFileHandle%.7z %files%

请注意,使用\%~dp0可以省略%~dp1反斜杠,因为~dp修饰符会将%变量扩展为路径尾随\反斜杠。

如果源文件夹名称包含空格,请使用引用的目标文件名:

%~dp07za a -t7z "%~dp1%zipFileHandle%.7z" %files%

答案 1 :(得分:0)

您可以在致电pushd %~dp1之前7za。这会暂时将第一个拖放文件的UNC路径映射为网络驱动器号并将目录更改为它。一旦脚本存在,映射就会消失。

此外,7za可能会使用exit codes来容错。

@echo off
setlocal

for /f "tokens=2 delims=.=" %%I in (
    'wmic os get localdatetime /format:list ^| find "="'
) do set "t=%%I"

set "handle=%t:~0,4%-%t:~4,2%-%t:~6,2%_%t:~8,2%-%t:~10,2%-%t:~12,2%"

pushd "%~dp1"

"%~dp0\7za" a -t7z "%handle%.7z" %* || (
    if ERRORLEVEL 2 (
        echo Zipping failed.
        pause
    ) else (
        echo Zipping completed with errors, possibly because a file is locked by another process.
        pause
    )
)