【问题标题】:How to extract part of a string using only variables in a batch file?如何仅使用批处理文件中的变量提取字符串的一部分?
【发布时间】:2020-06-13 10:00:51
【问题描述】:

也许我试图把事情过分简单化。无法删除要用作路径名的变量的一部分。目标是将多个 Windows 配置文件上的文件夹(和子文件夹)中的所有内容转移到单个配置文件中。

我可以复制所有内容,但不能告诉它放在哪里。也碰巧第一次尝试使用 robocopy。我想在桌面上创建一个文件夹,命名为设备上每个用户的用户名,然后复制所有内容。

for /d %%a in (C:\Users\*) do (

     set var=%%a
     var=${var#*s/ }

mkdir "%USERPROFILE%\Desktop\Backup\%var%\folderx"

xcopy "%%a\Desktop\folderx" "%USERPROFILE%\Desktop\Backup\%var%\folderx" /E /Y
)

注意事项:

  1. 不确定删除 C:\Users\ 的最佳方法,所以我只保留用户名作为变量(假设 var 是命令)
  2. 我正在尝试这样做,而不必将字符串写入文件并读回
  3. 假设备份文件夹已经创建

【问题讨论】:

  • 打开command prompt,运行for /? 并阅读输出帮助。 %~nxI 引用当前分配给循环变量I 的文件/文件夹字符串的最后一个反斜杠之后的字符串,在您的情况下,这将是%HomeDrive%\Users 中文件夹的名称。在您的情况下,您必须在批处理文件中使用 %%~nxa 来引用目录名称,并且您在阅读 FOR 的帮助并查看此修饰符字符串后知道为什么 aA 是循环变量没有好的选择。循环变量区分大小写,但修饰符不区分大小写。

标签: batch-file variables environment-variables backup


【解决方案1】:

仍然不确定如何正确剥离它。只是发现首先不包括驱动器更有效。

  1. List item dir 获取名称的裸命令
  2. 将 C: 更改为用户变量,以防安装在不同的字母上

FOR /f "tokens=*" %%a in ('dir /b /a:d-s-l "%SystemDrive%\Users"') DO (

    mkdir "%USERPROFILE%\Desktop\Backup\%%a\folderx"
    mkdir "%USERPROFILE%\Desktop\Backup\%%\foldery"

    xcopy "%SystemDrive%\Users\%%a\Desktop\folderx" "%USERPROFILE%\Desktop\Backup\%%a\folderx" /e /y
    xcopy "%SystemDrive%\Users\%%a\Desktop\foldery" "%USERPROFILE%\Desktop\Backup\%%a\foldery" /e /y

)

严格来说,不是答案,而是解决根本问题的更清洁的方法。仍然不确定如何正确剥离信息。

【讨论】:

  • %HOMEDRIVE% 通常是Users 文件夹所在的驱动器,%SystemDrive% 通常是Windows 文件夹所在的驱动器。这两个文件夹通常位于同一个驱动器上,但并非总是如此。
  • 我建议使用 "eol=| delims=" 而不是 "tokens=*" 以确保真正处理正确的所有由 DIR 输出的文件夹,包括以一个或多个空格或分号 (在 0 个或多个前导空格之后)。 "tokens=*" 导致首先从捕获的行中删除所有前导/空格制表符,如果剩余的字符串以分号开头,则忽略该行。 "eol=| delims=" 通过定义一个空的分隔符列表来关闭行拆分行为,并将行尾字符重新定义为一个竖线,该竖线没有文件/文件夹名称可以包含,因此不再被忽略。
  • 最好在两个 XCOPY 复制命令行上指定目标文件夹,并在结束 \ 结束之前关闭 " 以使其 100% 清楚 XCOPY 目标是目录而不是文件。那么这两个mkdir 根本就不需要了,因为 XCOPY 会在复制文件之前自动创建目标目录。顺便说一句:第二个mkdir%% 之后错过了循环变量a。在命令提示符窗口中运行 robocopy /? 以获取有关此可执行文件的帮助,现在应该使用它而不是 xcopy 可执行文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2017-07-02
  • 2023-03-07
  • 2021-03-29
相关资源
最近更新 更多