在后台运行批处理脚本

时间:2014-05-12 19:13:18

标签: batch-file

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

   :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开关启动命令,从insde java类启动它,将exit 0添加到批处理脚本的末尾,使用nssm创建服务,然后从那里。 我处于精神障碍。我需要做的就是能够在后台启动这个批处理脚本文件,一旦我完成启动脚本,关闭窗口并且没有任何可见的窗口打开..

感谢所有人的帮助!

1 个答案:

答案 0 :(得分: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部分,并在没有初始可见控制台的情况下启动所有进程。

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