在批处理文件中,如何获取文件夹名称,而不是整个目录?

问题描述 投票:0回答:1

我有一个批处理文件,用于对具有特定设置的 7zip 文件进行压缩,如果 PC 内存不足或由于某种原因出现故障,它会自动减少设置。我将一个文件夹拖到批处理文件上,它将在被 7zipped 的文件夹的根目录中创建一个存档。

eg:要压缩的文件夹

Z:\Test\Example Folder
。如果我使用这段代码:

for %%x in (%*) do (
Rem //  Use Current Argument To set File, Folder, and Archive Paths
    Set filePath="%%~x"
    Set directoryFiles="%%~x\*"
    Set archivePath="%%~x.7z"

我最终在被压缩文件夹的根目录中得到了一个 7zip 文件,例如

Z:\Test\Example Folder.7z

如果我使用此代码:

for %%x in (%*) do (
Rem //  Use Current Argument To set File, Folder, and Archive Paths
    Set filePath="%%~x"
    Set directoryFiles="%%~x\*"
    Set archivePath="C:\Users\Dr4gon\Downloads\Compressed\NEW.7z"

我最终得到一个 7zip 文件,

C:\Users\Dr4gon\Downloads\Compressed\NEW.7z

我试过修改

C:\Users\Dr4gon\Downloads\Compressed\%%~x.7z
,但还是失败了。我想是因为
%%~x
实际上意味着
Z:\Test\Example Folder
而不仅仅是
Example Folder

我需要使用什么代码来完成 7zip 文件:

C:\Users\Dr4gon\Downloads\Compressed\Example Folder.7z

代码发生这种变化的主要原因,是因为有时我需要在网络上压缩7zip文件夹,速度太慢,有时会失败,同时写入网络驱动器。我希望能够设置默认文件夹并在跨不同驱动器使用 7zip 时获得速度优势。

batch-file directory 7zip
1个回答
-1
投票

具体要求的代码是

%%~nx
。这会获取文件夹名称并允许使用它来移动默认存档位置。

例如压缩

Z:\Test\Example Folder
,将文件存放在
C:\Users\Dr4gon\Downloads\Compressed

    Set archivePath="C:\Users\Dr4gon\Downloads\Compressed\%%~nx.7z"

如果是插入原代码:

     for %%x in (%*) do (
Rem //  Use Current Argument To Set File, Folder, and Archive Paths
    Set filePath="%%~x"
    Set directoryFiles="%%~x\*"
    Set archivePath="C:\Users\Dr4gon\Downloads\Compressed\%%~nx.7z"

文件正确放置在原文件夹名的压缩文件夹中:

C:\Users\Dr4gon\Downloads\Compressed\Example Folder.7z

与其使用

for
不如使用
:LoopStart
更好,在这种情况下定义7z文件名的方法将是
%~n1
.

例如:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "archivePath=C:\Users\Dr4gon\Downloads\Compressed\%~n1.7z"
set /a count=0
:LoopStart
set /a count+=1
if %count% gtr 4 goto EndLoop
if %count%==1 (
  set successThread=3
  set successDictionary=2048m
) else if %count%==2 (
  set successThread=5
  set successDictionary=1024m
) else if %count%==3 (
  set successThread=8
  set successDictionary=256m
) else if %count%==4 (
  set successThread=6
  set successDictionary=96m
)
"C:\Program Files\7-Zip\7z.exe" a -aoa -t7z -mx9 -m0=LZMA2 -md=!successDictionary! -mfb273 -mmt=!successThread! -v1073741824 "!archivePath!" "%~1\*"
pause
exit

这将使您能够将输出 7z 文件的位置设置为您选择的位置。如果您想做出选择,请添加以下内容:

:input
cls
set "response="
choice /M "Should the 7z file be placed into the current directory?" /C YN
if errorlevel 2 goto No
if errorlevel 1 goto Yes
:Yes
set "archivePath=%~n1.7z"
goto :Loop
:No
set "archivePath=C:\Users\D4rgon\Downloads\Compressed\%~n1.7z"
goto :Loop
:Loop

这可以让您根据情况进行选择。但是警告,这不会压缩单个文件,只会压缩文件夹,在有限的测试中,一些特殊字符可以工作,但其他字符可能会导致问题;例如,文件夹名称中的

!
,将导致失败。

© www.soinside.com 2019 - 2024. All rights reserved.