从 UNC 拖放到批处理文件 - 如何捕获 %cd%
Drag and drop to batch file from UNC - how to capture %cd%
我有一个批处理文件:
@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=%*
%~dp0za a -t7z %cd%\%zipFileHandle%.7z %files%
当我将一组文件 and/or 目录放到它上面时,它会将它们压缩到一个过时的 .7z 文件中,这些文件位于它们全部来自的根文件夹中。
问题是,如果我删除网络文件,路径以 \
开头,批处理文件会将保存目录的值更改为 C:\Windows
。
在 cmd
将其更改为系统根之前,如何获取 %cd%
的值?
如果那不可能,是否可以从变量 %files%
中获取公共根文件夹?
您应该会收到下一条消息:
'\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
修饰符将 %variable 扩展为 Path 仅包含尾随 \
反斜杠。
如果源文件夹名称包含空格,则使用带引号的目标文件名:
%~dp07za a -t7z "%~dp1%zipFileHandle%.7z" %files%
您可以 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"
"%~dp0za" 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
)
)
我有一个批处理文件:
@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=%*
%~dp0za a -t7z %cd%\%zipFileHandle%.7z %files%
当我将一组文件 and/or 目录放到它上面时,它会将它们压缩到一个过时的 .7z 文件中,这些文件位于它们全部来自的根文件夹中。
问题是,如果我删除网络文件,路径以 \
开头,批处理文件会将保存目录的值更改为 C:\Windows
。
在 cmd
将其更改为系统根之前,如何获取 %cd%
的值?
如果那不可能,是否可以从变量 %files%
中获取公共根文件夹?
您应该会收到下一条消息:
'\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
修饰符将 %variable 扩展为 Path 仅包含尾随 \
反斜杠。
如果源文件夹名称包含空格,则使用带引号的目标文件名:
%~dp07za a -t7z "%~dp1%zipFileHandle%.7z" %files%
您可以 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"
"%~dp0za" 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
)
)