【问题标题】:Grab all subfolders names at all levels as well as their files' names and then use them; ignore batch file's name获取所有级别的所有子文件夹名称以及它们的文件名,然后使用它们;忽略批处理文件的名称
【发布时间】:2019-10-02 13:46:21
【问题描述】:

我有以下脚本(基于this answer),它允许使用文件名作为任务名从当前文件夹导入所有任务计划程序任务:

@echo off

setlocal disabledelayedexpansion

for %%e in ("%~dp0*") do (
  schtasks /create /tn "%%~ne" /xml "%%~e"
)

我需要以某种方式对其进行修改,以便它还可以在所有子文件夹(所有级别)中查找文件并相应地创建任务。例如。如果批处理与名为“Dummy1”、“Dummy2”、“Dummy3”的任务文件一起位于某个文件夹中,则任务应导入为“Dummy1”、“Dummy2”、“Dummy3”。如果包含批处理文件的文件夹中还包含名为“Dummy1”、“Dummy2”的任务的子文件夹“Subby1”,则这些任务应导入为“Subby1\Dummy1”、“Subby1\Dummy2”。如果包含批处理文件的文件夹包含名为“Dummy1”、“Dummy2”的任务的子文件夹“Subby1\Sub-Subby”,则这些任务应导入为“Subby1\Sub-Subby\Dummy1”、“Subby1\Sub- Subby\Dummy2"等

我还想让它忽略批处理文件本身,但不排除 .bat 扩展名。

我试过这个,但我不擅长批处理脚本,所以显然它不起作用,我什至不明白为什么:

for %%e in ("%~I") do (
  schtasks /create /tn "%%~I\%%~ne" /xml "%%~e"
)

至于排除批处理文件,我不知道该怎么做。

【问题讨论】:

  • 我需要一个脚本来处理与批处理文件位于同一文件夹中的文件(不包括批处理文件本身)以及所有级别的所有子文件夹中的所有文件(并使用相同的文件夹结构)。我不知道你所说的可执行文件是什么意思。
  • 作为基础:for /R "%~dp0." %%e in (*.*) do ( ... )?
  • @aschipfl 之后如何引用子文件夹名称?因此它会导入具有相应文件夹结构的文件。
  • for /R "%~dp0." in (*.*) do ( schtasks /create /tn "%%~fe\%%~ne" /xml "%%~e" ) 脚本在启动时关闭。
  • 不是双击,而是通过打开命令提示符窗口并键入脚本路径/名称来运行批处理文件,然后您可以阅读 amy 返回的错误。请注意,%%~fe 返回完整的绝对路径...

标签: batch-file


【解决方案1】:

您也可以将 standard for loop 更改为 for /R loop 以包含子目录:

rem // Iterate over all files in the directory tree rooted at the parent directory of this script:
set "RELPATH=#"
for /R "%~dp0." %%e in (*.*) do (
    if not defined RELPATH (
        rem // This creates scheduled tasks named of the pure base file names:
        schtasks /Create /TN "%%~ne" /XML "%%~e"
    ) else (
        rem // This creates scheduled tasks named of the relative file paths:
        set "ITEM=%%~e"
        setlocal EnableDelayedExpansion
        schtasks /Create /TN "!ITEM:*%~dp0=!" /XML "%%~e"
        endlocal
    )
)

由于使用sub-string substitution,上述代码在某些情况下可能会失败,例如当脚本的父目录包含等号时。但是,有一个解决方案也可以处理这种情况,使用xcopy /L,它返回相对路径而不实际复制任何内容(由于/L),从而避免了字符串操作。 for /F loop 捕获xcopy 的输出,删除前面的驱动器号(如D:)并过滤掉最后的摘要行(如# File(s)):

pushd "%~dp0." && (
    for /F "tokens=2 delims=:" %%e in ('xcopy /L /S /I "*.*" "%TEMP%"') do (
        schtasks /Create /TN "%%~e" /XML "%%~e"
    )
    popd
)

【讨论】:

  • 非常感谢。它工作得很好。我发现批处理脚本语言很难理解,tbh,非常感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多