批处理:将顶级文件夹名称设置为变量

批处理:将顶级文件夹名称设置为变量

环境:Windows 10
问题:如果可能的话 - 我们如何将驱动器上最顶层文件夹的名称设置为变量?

我们从第三方收到一张光盘,其中包含我们使用的系统的更新 - 光盘上是一个带有当前版本标题的文件夹(例如blahblahSystemblah-2018October-finalblah),并且包含该版本中的所有数据。将光盘放入系统后,我们使用 robocopy 用更改更新服务器,然后运行系统的用户将由服务器进行更新。我们当前的问题是我们必须手动设置文件夹名称,因为 robocopy 不能(据我所知)在其源中使用通配符,文件夹名称在其他地方很重要,因此我们不能简单地让他们将内容直接放在光盘上,理想情况下,我们不想在运行批处理文件之前移动它(使用当前目录很容易,但正如我所说:文件夹名称很重要,我们试图将用户的任何手动输入/努力保持在最低限度)。

脚本的相关部分如下所示:

@echo off
for (however you can get the top folder name automatically) do (set VRSN=however)

robocopy "D:\VRSN" "C:\local\directory" /e /mir /r:0 /w:0 /log:"C:\log\directory.txt"

我能找到最接近的方法是这段脚本,其中“knownfile”是始终位于文件夹中的文件的名称:

setlocal enabledelayedexpansion

cd /d "D:\"

for /R %%G in (knownfile) do (
    set "var1=%%~dpG"
    set "var1=!var1:%CD%=!"
    if not "!var1!"=="!prev!" (
        if "!var1!"=="\" (echo .\) else echo(!var1:~1,-1!
    )
    set "prev=!var1!"
)

-- 但此脚本不仅输出包含该已知文件的文件夹,还截取文件夹名称的第一个字符。我首先承认我不完全理解语法或哪里出了问题,所以如果有人能给我指出更好的方向或帮助我改进上述代码以仅有的请归还该文件夹,我们将不胜感激。

答案1

您可以使用如下简单的方法:

@ECHO off
set knownfile=D:\Folder\File.txt

for /F "delims=\ tokens=2" %%G in ("%knownfile%") do (
    set prev=.\%%G
)

ECHO %prev%

截屏

其中knownfile环境变量是没有引号的完整路径。您无需为此解决方案启用延迟扩展或弄乱CD环境变量。

使用for /R,您可以遍历目录树,而for /F只是处理字符串并在\字符处将其拆分。

tokens=1告诉它使用字符串的第一部分。如果你想使用之后的任何文件夹,你可以使用tokens=1,2,3然后set prev=.\%%G\%%H\%%I

如果你想获取驱动器号,而不是使用.\,你可以使用set prev=%%~dG\%%~G

进一步阅读:

相关内容