【问题标题】:Running a batch script in the background在后台运行批处理脚本
【发布时间】:2014-05-12 19:13:18
【问题描述】:

所有, 我正在尝试重命名带有时间戳的文件并将其移动到另一个文件夹,这需要每秒持续完成,因为进程会创建具有相同名称的文件,但是它不会覆盖直到前一个文件有被移动了。

   :top
    @ECHO OFF
    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"

    set "fullstamp=%YYYY%%MM%%DD%.%HH%%Min%%Sec%"

    MOVE /Y C:\MyPath\Scripts\origfile.txt C:\MyPath\Scripts\997\newfile_%fullstamp%.txt

    sleep 1
    goto top

批处理文件完成其工作并重命名文件并将其移动到新目标。但是,我能够做到这一点的唯一方法是运行批处理文件并保持命令窗口打开。 我尝试了很多建议,使用 /B 开关启动命令,从 java 类的 insde 启动它,将出口 0 添加到批处理脚本的末尾,使用 nssm 创建服务,然后从那里运行它。 我处于心理障碍。我需要做的就是能够在后台启动这个批处理脚本文件,一旦我完成启动脚本,关闭窗口并且没有任何可见的窗口打开..

感谢大家的帮助!

【问题讨论】:

标签: batch-file


【解决方案1】:

这是来自previous answer

@if (@This==@IsBatch) @then
@echo off
rem **** batch zone *********************************************************

    rem Check if started from javascript part of script.
    rem We are checking an environment variable set from javascript part.
    if "%_run_hidden_%"=="true" (
        goto startBatchWork
    )

    rem if not started from javascript, call javascript part to restart batch.
    wscript //E:JScript "%~dpnx0" 
    exit /b

:startBatchWork

    for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
    set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
    set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
    set "fullstamp=%YYYY%%MM%%DD%.%HH%%Min%%Sec%"

    MOVE /Y C:\MyPath\Scripts\origfile.txt C:\MyPath\Scripts\997\newfile_%fullstamp%.txt
    sleep 1
    goto startBatchWork

    rem End of batch area. Ensure batch ends execution before reaching javascript zone
    exit /b

@end
// **** Javascript zone *****************************************************
// Instantiate the needed component to interact with Shell
var shell = WScript.CreateObject('WScript.Shell');

    // Set the environment variable that the batch part will check to know
    // it's running hidden
    shell.Environment('Process').Item('_run_hidden_')='true';

    // start the batch part of the script calling %comspec% with the current
    // script as parameter, hidden (0) and not waiting for it to end (false)
    shell.Run('"' + shell.ExpandEnvironmentStrings('%comspec%') + '" /c "' + WScript.ScriptFullName + '"', 0, false );

    // All done. Exit
    WScript.Quit(0);

这是一个混合 cmd/javascript 文件,您的代码包含在 :startBatchWork 之后。保存为.cmd文件。

您可以将其称为 cmd 文件。它将启动一个控制台(如果不在控制台中)来运行初始批处理部分。它将检查标志变量的存在以确定文件是否隐藏运行(从 js 部分开始)。如果它没有隐藏运行,则调用代码的 javascript 部分并设置标志变量并隐藏启动批处理文件。

或者,您可以使用wscript //e:JScript batchfile.cmd 直接调用javascript 部分并启动所有进程,而无需初始可见控制台。

在任何情况下,该进程都会在没有可见控制台的情况下继续隐藏运行。

【讨论】:

    猜你喜欢
    • 2013-07-30
    • 2011-06-15
    • 2018-07-08
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多