如何仅使用批处理文件中的变量提取字符串的一部分?
Posted
技术标签:
【中文标题】如何仅使用批处理文件中的变量提取字符串的一部分?【英文标题】: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
)
注意事项:
-
不确定删除 C:\Users\ 的最佳方法,所以我只保留用户名作为变量(假设 var 是命令)
我正在尝试这样做,而不必将字符串写入文件并读回
假设备份文件夹已经创建
【问题讨论】:
打开command prompt,运行for /?
并阅读输出帮助。 %~nxI
引用当前分配给循环变量I
的文件/文件夹字符串的最后一个反斜杠之后的字符串,在您的情况下,这将是%HomeDrive%\Users
中文件夹的名称。在您的情况下,您必须在批处理文件中使用 %%~nxa
来引用目录名称,并且您在阅读 FOR 的帮助并查看此修饰符字符串后知道为什么 a
和 A
是循环变量没有好的选择。循环变量区分大小写,但修饰符不区分大小写。
【参考方案1】:
仍然不确定如何正确剥离它。只是发现首先不包括驱动器更有效。
-
List item dir 获取名称的裸命令
将 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
可执行文件。以上是关于如何仅使用批处理文件中的变量提取字符串的一部分?的主要内容,如果未能解决你的问题,请参考以下文章
如何提取firebase中的所有孩子,其中某些部分等于某个字符串