【问题标题】:Direct Batch file to current-user Documents folder将批处理文件定向到当前用户的 Documents 文件夹
【发布时间】:2018-03-24 01:56:40
【问题描述】:

我在 Win 10 上,我的 Documents 文件夹通过 Windows 工具移动到了我的 E: 驱动器。我需要运行一个批处理文件来定位此路径,更改批处理文件中的当前目录并将文件从子文件夹复制到另一个驱动器。批处理文件需要能够从本地 PC 上的任何位置运行。

以下返回 E:\Users\username\Documents\Test\T1 但它实际上并没有更改批处理文件中的目录。

@echo
for /f "tokens=3*" %%p in ('REG QUERY "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /v Personal') do set DocumentsFolder=%%p
echo %DocumentsFolder%\Test\T1\

所有复制命令行都在批处理文件的同一部分。本节开头的一张 cd 会影响整个部分吗?

我非常感谢任何建议。当我想学习新事物时,我经常访问这个网站,但我找不到这个答案。

非常感谢

【问题讨论】:

  • 您不能只在部分开头添加 一张 cd 并自己确定它是否有效?
  • 感谢您的回复和回答,是的,我做到了。它不会改变目录。
  • 你应该检查%USERPROFILE%

标签: batch-file cd


【解决方案1】:

我认为您的问题只是您需要更改驱动器和目录。

最简单的方法是将/D 选项与CD 一起使用,在命令提示符下输入CD /? 以了解其用法。

@Echo Off
Set "RK=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
For /F "EOL=H Tokens=2*" %%A In ('Reg Query "%RK%" /V Personal'
) Do Echo CD /D "%%~B\Test\T1"
Copy /Y "text1.txt" "F:\Test\T1"
Pause

或无需更改目录:

@Echo Off
Set "RK=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
For /F "EOL=H Tokens=2*" %%A In ('Reg Query "%RK%" /V Personal'
) Do Copy /Y "%%~B\Test\T1\text1.txt" "F:\Test\T1"
Pause

【讨论】:

  • 非常好的 Compo,谢谢。它工作得很好,但它仍然先在 C:\~Documents 中查找,找不到文件,然后转到 E:\~Documents 并处理任务。是否有解决此问题的方法? @Echo For /F "Tokens=2*" %%A In ('Reg Query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /V Personal') 执行 cd /D %%B\Test cd "T1" 复制 "text1.txt" "F:\Test\T1"
  • 我已经更新了我的答案,以满足您的实际意图以及目录更改,这不是必需的
【解决方案2】:

谢谢各位大佬 我正在使用迈克尔的方法 atm。有许多文件正在备份。我很喜欢学习新事物。我还不太了解令牌,但到了那里。

set "Personal="
for /f "tokens=1,3" %%A in ('reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /V Personal') do if /i "%%~A" == "Personal" set "Personal=%%~B"
if not defined Personal exit /b 1
cd /d "%Personal%\A2A\FSX"

cd "B17"
>NUL COPY "B17log.dat" "F:\Dropbox\My FlightSim Backup\[user folder]\Documents\A2A\FSX\B17\B17log_%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,5%.dat"

cd "..\377"
>NUL COPY "377log.dat" "F:\Dropbox\My FlightSim Backup\[user folder]\Documents\A2A\FSX\377\377log_%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,5%.dat"
>NUL COPY "B377log.dat" "F:\Dropbox\My FlightSim Backup\[user folder]\Documents\A2A\FSX\377\B377log_%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,5%.dat"
>NUL COPY "B377.dat" "F:\Dropbox\My FlightSim Backup\[user folder]\Documents\A2A\FSX\377\B377_%date:~10,4%-%date:~4,2%-%date:~7,2%_%time:~0,2%_%time:~3,2%_%time:~6,5%.dat"
>NUL COPY "axisConfig.cfg" "F:\Dropbox\My FlightSim Backup\[user folder]\Documents\A2A\FSX\377\axisConfig.cfg"

再次感谢,非常感谢 罗杰

【讨论】:

  • 修复了我的答案中的一个错误,即 reg 数据的路径带有空格。您可能需要更新您的代码。
【解决方案3】:

reg query 返回的数据不是查询的干净数据。

我得到一个 CRLF,然后是完整的键路径,CRLF,然后是值,类型 和数据。其次是至少另一个 CRLF。

我将在%%A 的第一个标记中搜索值Personal%%B 的第二个标记具有此处未使用的数据类型。 第三个令牌具有所需的数据,因此它将在%%C 中 使用tokens=1,2*

@echo off
set "Personal="

for /f "tokens=1,2*" %%A in (
    'reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" /V Personal'
) do if /i "%%~A" == "Personal" set "Personal=%%~C"

if not defined Personal exit /b 1

cd /d "%Personal%"
echo %cd%
pause

处理令牌

示例字符串:

带有空格的个人 REG_SZ D:\User\Documents

Delims 设置默认为 spacestabs。使用for /? 寻求帮助。 分隔符分隔标记。

tokens=1 开始,它将获得第一个令牌Personal

,2 添加为tokens=1,2,这将获得第一个令牌Personal 和 第二个令牌REG_SZ

* 添加为tokens=1,2* 将获得第一个令牌Personal, 第二个令牌REG_SZ 和第三个令牌将覆盖其余的 D:\User\Documents With Spaces.

令牌模式2* 之间的逗号是可选的,因此我这样做了 不加逗号。

使用%%A 作为初始for 变量,%%A 包含第一个标记, %%B 包含第二个令牌。 %%C 包含第三个令牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多