2016-12-21 35 views
3

目前,我有以下文件:管道在批處理腳本通話功能

script.bat

type input1.csv | repl.bat " " "" >> output1.csv 
type input2.csv | repl.bat " " "" >> output2.csv 
type input3.csv | repl.bat " " "" >> output3.csv 

repl.bat 來源:https://gist.github.com/wpsmith/8459524

我想要編譯功能repl.bat到Script.bat中。

我想:

:replscript 
{repl content blah blah} 
@exit /b 
type input1.csv | replscript " " "" >> output1.csv 
type input2.csv | replscript " " "" >> output2.csv 
type input3.csv | replscript " " "" >> output3.csv 

但好像它不工作。

任何想法?

[更新1] 完整的腳本如下

@echo off 
set "func=%~1" 
if ":" == "%func:~0,1%" (
    shift 
    goto %func% 
) 
echo Main started 
type input.csv | "%~f0" :replscript " " "" >>output.csv 
exit /b 

::************ Batch portion *********** 
:replscript 

if .%2 equ . (
    if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a 
    exit /b 0 
) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx" 
    exit /b 0 
) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx" 
    exit /b 0 
) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a 
    exit /b 0 
) else (
    call :err "Insufficient arguments" 
    exit /b 2 
) 
) 
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
    call :err "Invalid option(s)" 
    exit /b 2 
) 
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
    call :err "Incompatible options" 
    exit /b 2 
) 
cscript //E:JScript //nologo "%~f0" %* 
exit /b %errorlevel% 

:err 
>&2 echo ERROR: %~1. Use REPL /? to get help. 
exit /b 

************* JScript portion **********/ 
var rtn=1; 
try { 
    var env=WScript.CreateObject("WScript.Shell").Environment("Process"); 
    var args=WScript.Arguments; 
    var search=args.Item(0); 
    var replace=args.Item(1); 
    var options="g"; 
    if (args.length>2) options+=args.Item(2).toLowerCase(); 
    var multi=(options.indexOf("m")>=0); 
    var alterations=(options.indexOf("a")>=0); 
    if (alterations) options=options.replace(/a/g,""); 
    var srcVar=(options.indexOf("s")>=0); 
    if (srcVar) options=options.replace(/s/g,""); 
    var jexpr=(options.indexOf("j")>=0); 
    if (jexpr) options=options.replace(/j/g,""); 
    if (options.indexOf("v")>=0) { 
    options=options.replace(/v/g,""); 
    search=env(search); 
    replace=env(replace); 
    } 
    if (options.indexOf("x")>=0) { 
    options=options.replace(/x/g,""); 
    if (!jexpr) { 
     replace=replace.replace(/\\\\/g,"\\B"); 
     replace=replace.replace(/\\q/g,"\""); 
     replace=replace.replace(/\\x80/g,"\\u20AC"); 
     replace=replace.replace(/\\x82/g,"\\u201A"); 
     replace=replace.replace(/\\x83/g,"\\u0192"); 
     replace=replace.replace(/\\x84/g,"\\u201E"); 
     replace=replace.replace(/\\x85/g,"\\u2026"); 
     replace=replace.replace(/\\x86/g,"\\u2020"); 
     replace=replace.replace(/\\x87/g,"\\u2021"); 
     replace=replace.replace(/\\x88/g,"\\u02C6"); 
     replace=replace.replace(/\\x89/g,"\\u2030"); 
     replace=replace.replace(/\\x8[aA]/g,"\\u0160"); 
     replace=replace.replace(/\\x8[bB]/g,"\\u2039"); 
     replace=replace.replace(/\\x8[cC]/g,"\\u0152"); 
     replace=replace.replace(/\\x8[eE]/g,"\\u017D"); 
     replace=replace.replace(/\\x91/g,"\\u2018"); 
     replace=replace.replace(/\\x92/g,"\\u2019"); 
     replace=replace.replace(/\\x93/g,"\\u201C"); 
     replace=replace.replace(/\\x94/g,"\\u201D"); 
     replace=replace.replace(/\\x95/g,"\\u2022"); 
     replace=replace.replace(/\\x96/g,"\\u2013"); 
     replace=replace.replace(/\\x97/g,"\\u2014"); 
     replace=replace.replace(/\\x98/g,"\\u02DC"); 
     replace=replace.replace(/\\x99/g,"\\u2122"); 
     replace=replace.replace(/\\x9[aA]/g,"\\u0161"); 
     replace=replace.replace(/\\x9[bB]/g,"\\u203A"); 
     replace=replace.replace(/\\x9[cC]/g,"\\u0153"); 
     replace=replace.replace(/\\x9[dD]/g,"\\u009D"); 
     replace=replace.replace(/\\x9[eE]/g,"\\u017E"); 
     replace=replace.replace(/\\x9[fF]/g,"\\u0178"); 
     replace=replace.replace(/\\b/g,"\b"); 
     replace=replace.replace(/\\f/g,"\f"); 
     replace=replace.replace(/\\n/g,"\n"); 
     replace=replace.replace(/\\r/g,"\r"); 
     replace=replace.replace(/\\t/g,"\t"); 
     replace=replace.replace(/\\v/g,"\v"); 
     replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, 
     function($0,$1,$2){ 
      return String.fromCharCode(parseInt("0x"+$0.substring(2))); 
     } 
    ); 
     replace=replace.replace(/\\B/g,"\\"); 
    } 
    search=search.replace(/\\\\/g,"\\B"); 
    search=search.replace(/\\q/g,"\""); 
    search=search.replace(/\\x80/g,"\\u20AC"); 
    search=search.replace(/\\x82/g,"\\u201A"); 
    search=search.replace(/\\x83/g,"\\u0192"); 
    search=search.replace(/\\x84/g,"\\u201E"); 
    search=search.replace(/\\x85/g,"\\u2026"); 
    search=search.replace(/\\x86/g,"\\u2020"); 
    search=search.replace(/\\x87/g,"\\u2021"); 
    search=search.replace(/\\x88/g,"\\u02C6"); 
    search=search.replace(/\\x89/g,"\\u2030"); 
    search=search.replace(/\\x8[aA]/g,"\\u0160"); 
    search=search.replace(/\\x8[bB]/g,"\\u2039"); 
    search=search.replace(/\\x8[cC]/g,"\\u0152"); 
    search=search.replace(/\\x8[eE]/g,"\\u017D"); 
    search=search.replace(/\\x91/g,"\\u2018"); 
    search=search.replace(/\\x92/g,"\\u2019"); 
    search=search.replace(/\\x93/g,"\\u201C"); 
    search=search.replace(/\\x94/g,"\\u201D"); 
    search=search.replace(/\\x95/g,"\\u2022"); 
    search=search.replace(/\\x96/g,"\\u2013"); 
    search=search.replace(/\\x97/g,"\\u2014"); 
    search=search.replace(/\\x98/g,"\\u02DC"); 
    search=search.replace(/\\x99/g,"\\u2122"); 
    search=search.replace(/\\x9[aA]/g,"\\u0161"); 
    search=search.replace(/\\x9[bB]/g,"\\u203A"); 
    search=search.replace(/\\x9[cC]/g,"\\u0153"); 
    search=search.replace(/\\x9[dD]/g,"\\u009D"); 
    search=search.replace(/\\x9[eE]/g,"\\u017E"); 
    search=search.replace(/\\x9[fF]/g,"\\u0178"); 
    if (options.indexOf("l")>=0) { 
     search=search.replace(/\\b/g,"\b"); 
     search=search.replace(/\\f/g,"\f"); 
     search=search.replace(/\\n/g,"\n"); 
     search=search.replace(/\\r/g,"\r"); 
     search=search.replace(/\\t/g,"\t"); 
     search=search.replace(/\\v/g,"\v"); 
     search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, 
     function($0,$1,$2){ 
      return String.fromCharCode(parseInt("0x"+$0.substring(2))); 
     } 
    ); 
     search=search.replace(/\\B/g,"\\"); 
    } else search=search.replace(/\\B/g,"\\\\"); 
    } 
    if (options.indexOf("l")>=0) { 
    options=options.replace(/l/g,""); 
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1"); 
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$"); 
    } 
    if (options.indexOf("b")>=0) { 
    options=options.replace(/b/g,""); 
    search="^"+search 
    } 
    if (options.indexOf("e")>=0) { 
    options=options.replace(/e/g,""); 
    search=search+"$" 
    } 
    var search=new RegExp(search,options); 
    var str1, str2; 

    if (srcVar) { 
    str1=env(args.Item(3)); 
    str2=str1.replace(search,jexpr?replFunc:replace); 
    if (!alterations || str1!=str2) if (multi) { 
     WScript.Stdout.Write(str2); 
    } else { 
     WScript.Stdout.WriteLine(str2); 
    } 
    if (str1!=str2) rtn=0; 
    } else if (multi){ 
    var buf=1024; 
    str1=""; 
    while (!WScript.StdIn.AtEndOfStream) { 
     str1+=WScript.StdIn.Read(buf); 
     buf*=2 
    } 
    str2=str1.replace(search,jexpr?replFunc:replace); 
    WScript.Stdout.Write(str2); 
    if (str1!=str2) rtn=0; 
    } else { 
    while (!WScript.StdIn.AtEndOfStream) { 
     str1=WScript.StdIn.ReadLine(); 
     str2=str1.replace(search,jexpr?replFunc:replace); 
     if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2); 
     if (str1!=str2) rtn=0; 
    } 
    } 
} catch(e) { 
    WScript.Stderr.WriteLine("JScript runtime error: "+e.message); 
    rtn=3; 
} 
WScript.Quit(rtn); 

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) { 
    var $=arguments; 
    return(eval(replace)); 
} 

@exit /b 

但是當我運行它,它拋出的錯誤,而不是(感謝@Jeb您的輸入!): 「這個過程試着寫到一個不存在的管道。「

有什麼想法? :)

[更新2] 如果我有其他的命令來執行,我可以把他們的主要計劃下,如:

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment 

::************ Batch portion *********** 
@echo off 
set "func=%~0" 
if """" == "%func:~-2%" (
    goto :replscript 
) 

if exist k:\%year%\%year%_%currmonth%\donotdelete.txt goto splitfile 

type input.csv | "%~f0""" " " "" >>output.csv 

del ST*.csv 
exit /b 





    ::************ Batch portion *********** 

    :replscript 

if .%2 equ . (
    if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a 
    exit /b 0 
) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx" 
    exit /b 0 
) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx" 
    exit /b 0 
) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a 
    exit /b 0 
) else (
    call :err "Insufficient arguments" 
    exit /b 2 
) 
) 
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
    call :err "Invalid option(s)" 
    exit /b 2 
) 
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
    call :err "Incompatible options" 
    exit /b 2 
) 
cscript //E:JScript //nologo "%~f0" %* 
exit /b %errorlevel% 

:err 
>&2 echo ERROR: %~1. Use REPL /? to get help. 
exit /b 

************* JScript portion **********/ 
var rtn=1; 
try { 
    var env=WScript.CreateObject("WScript.Shell").Environment("Process"); 
    var args=WScript.Arguments; 
    var search=args.Item(0); 
    var replace=args.Item(1); 
    var options="g"; 
    if (args.length>2) options+=args.Item(2).toLowerCase(); 
    var multi=(options.indexOf("m")>=0); 
    var alterations=(options.indexOf("a")>=0); 
    if (alterations) options=options.replace(/a/g,""); 
    var srcVar=(options.indexOf("s")>=0); 
    if (srcVar) options=options.replace(/s/g,""); 
    var jexpr=(options.indexOf("j")>=0); 
    if (jexpr) options=options.replace(/j/g,""); 
    if (options.indexOf("v")>=0) { 
    options=options.replace(/v/g,""); 
    search=env(search); 
    replace=env(replace); 
    } 
    if (options.indexOf("x")>=0) { 
    options=options.replace(/x/g,""); 
    if (!jexpr) { 
     replace=replace.replace(/\\\\/g,"\\B"); 
     replace=replace.replace(/\\q/g,"\""); 
     replace=replace.replace(/\\x80/g,"\\u20AC"); 
     replace=replace.replace(/\\x82/g,"\\u201A"); 
     replace=replace.replace(/\\x83/g,"\\u0192"); 
     replace=replace.replace(/\\x84/g,"\\u201E"); 
     replace=replace.replace(/\\x85/g,"\\u2026"); 
     replace=replace.replace(/\\x86/g,"\\u2020"); 
     replace=replace.replace(/\\x87/g,"\\u2021"); 
     replace=replace.replace(/\\x88/g,"\\u02C6"); 
     replace=replace.replace(/\\x89/g,"\\u2030"); 
     replace=replace.replace(/\\x8[aA]/g,"\\u0160"); 
     replace=replace.replace(/\\x8[bB]/g,"\\u2039"); 
     replace=replace.replace(/\\x8[cC]/g,"\\u0152"); 
     replace=replace.replace(/\\x8[eE]/g,"\\u017D"); 
     replace=replace.replace(/\\x91/g,"\\u2018"); 
     replace=replace.replace(/\\x92/g,"\\u2019"); 
     replace=replace.replace(/\\x93/g,"\\u201C"); 
     replace=replace.replace(/\\x94/g,"\\u201D"); 
     replace=replace.replace(/\\x95/g,"\\u2022"); 
     replace=replace.replace(/\\x96/g,"\\u2013"); 
     replace=replace.replace(/\\x97/g,"\\u2014"); 
     replace=replace.replace(/\\x98/g,"\\u02DC"); 
     replace=replace.replace(/\\x99/g,"\\u2122"); 
     replace=replace.replace(/\\x9[aA]/g,"\\u0161"); 
     replace=replace.replace(/\\x9[bB]/g,"\\u203A"); 
     replace=replace.replace(/\\x9[cC]/g,"\\u0153"); 
     replace=replace.replace(/\\x9[dD]/g,"\\u009D"); 
     replace=replace.replace(/\\x9[eE]/g,"\\u017E"); 
     replace=replace.replace(/\\x9[fF]/g,"\\u0178"); 
     replace=replace.replace(/\\b/g,"\b"); 
     replace=replace.replace(/\\f/g,"\f"); 
     replace=replace.replace(/\\n/g,"\n"); 
     replace=replace.replace(/\\r/g,"\r"); 
     replace=replace.replace(/\\t/g,"\t"); 
     replace=replace.replace(/\\v/g,"\v"); 
     replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, 
     function($0,$1,$2){ 
      return String.fromCharCode(parseInt("0x"+$0.substring(2))); 
     } 
    ); 
     replace=replace.replace(/\\B/g,"\\"); 
    } 
    search=search.replace(/\\\\/g,"\\B"); 
    search=search.replace(/\\q/g,"\""); 
    search=search.replace(/\\x80/g,"\\u20AC"); 
    search=search.replace(/\\x82/g,"\\u201A"); 
    search=search.replace(/\\x83/g,"\\u0192"); 
    search=search.replace(/\\x84/g,"\\u201E"); 
    search=search.replace(/\\x85/g,"\\u2026"); 
    search=search.replace(/\\x86/g,"\\u2020"); 
    search=search.replace(/\\x87/g,"\\u2021"); 
    search=search.replace(/\\x88/g,"\\u02C6"); 
    search=search.replace(/\\x89/g,"\\u2030"); 
    search=search.replace(/\\x8[aA]/g,"\\u0160"); 
    search=search.replace(/\\x8[bB]/g,"\\u2039"); 
    search=search.replace(/\\x8[cC]/g,"\\u0152"); 
    search=search.replace(/\\x8[eE]/g,"\\u017D"); 
    search=search.replace(/\\x91/g,"\\u2018"); 
    search=search.replace(/\\x92/g,"\\u2019"); 
    search=search.replace(/\\x93/g,"\\u201C"); 
    search=search.replace(/\\x94/g,"\\u201D"); 
    search=search.replace(/\\x95/g,"\\u2022"); 
    search=search.replace(/\\x96/g,"\\u2013"); 
    search=search.replace(/\\x97/g,"\\u2014"); 
    search=search.replace(/\\x98/g,"\\u02DC"); 
    search=search.replace(/\\x99/g,"\\u2122"); 
    search=search.replace(/\\x9[aA]/g,"\\u0161"); 
    search=search.replace(/\\x9[bB]/g,"\\u203A"); 
    search=search.replace(/\\x9[cC]/g,"\\u0153"); 
    search=search.replace(/\\x9[dD]/g,"\\u009D"); 
    search=search.replace(/\\x9[eE]/g,"\\u017E"); 
    search=search.replace(/\\x9[fF]/g,"\\u0178"); 
    if (options.indexOf("l")>=0) { 
     search=search.replace(/\\b/g,"\b"); 
     search=search.replace(/\\f/g,"\f"); 
     search=search.replace(/\\n/g,"\n"); 
     search=search.replace(/\\r/g,"\r"); 
     search=search.replace(/\\t/g,"\t"); 
     search=search.replace(/\\v/g,"\v"); 
     search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g, 
     function($0,$1,$2){ 
      return String.fromCharCode(parseInt("0x"+$0.substring(2))); 
     } 
    ); 
     search=search.replace(/\\B/g,"\\"); 
    } else search=search.replace(/\\B/g,"\\\\"); 
    } 
    if (options.indexOf("l")>=0) { 
    options=options.replace(/l/g,""); 
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1"); 
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$"); 
    } 
    if (options.indexOf("b")>=0) { 
    options=options.replace(/b/g,""); 
    search="^"+search 
    } 
    if (options.indexOf("e")>=0) { 
    options=options.replace(/e/g,""); 
    search=search+"$" 
    } 
    var search=new RegExp(search,options); 
    var str1, str2; 

    if (srcVar) { 
    str1=env(args.Item(3)); 
    str2=str1.replace(search,jexpr?replFunc:replace); 
    if (!alterations || str1!=str2) if (multi) { 
     WScript.Stdout.Write(str2); 
    } else { 
     WScript.Stdout.WriteLine(str2); 
    } 
    if (str1!=str2) rtn=0; 
    } else if (multi){ 
    var buf=1024; 
    str1=""; 
    while (!WScript.StdIn.AtEndOfStream) { 
     str1+=WScript.StdIn.Read(buf); 
     buf*=2 
    } 
    str2=str1.replace(search,jexpr?replFunc:replace); 
    WScript.Stdout.Write(str2); 
    if (str1!=str2) rtn=0; 
    } else { 
    while (!WScript.StdIn.AtEndOfStream) { 
     str1=WScript.StdIn.ReadLine(); 
     str2=str1.replace(search,jexpr?replFunc:replace); 
     if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2); 
     if (str1!=str2) rtn=0; 
    } 
    } 
} catch(e) { 
    WScript.Stderr.WriteLine("JScript runtime error: "+e.message); 
    rtn=3; 
} 
WScript.Quit(rtn); 

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) { 
    var $=arguments; 
    return(eval(replace)); 
} 

@exit /b 

:splitfile 
cd\%year%\%year%_%currmonth%\folder 
mkdir %currdate% 
cd\Common_Access\STP 
copy input*.CSV k:\STP\Input 
+0

第二次更新:是的管道塊後,你可以添加更多的命令沒有任何問題 – jeb

回答

1

很好的嘗試,但是這根本是不可能的。您正試圖一次執行一個程序的兩個地方。批處理文件不支持線程或任何其他可能允許的機制。因此它的結果爲:

無效試圖調用批處理腳本

然而,當前的程序沒有得到,甚至因爲其他錯誤,到目前爲止之外批次標籤。

  1. replscript是在一開始,當它到達exit /b執行停止。您必須在主程序之後放置子程序或使用goto來跳過它們。

  2. 調用標籤的正確語法是call :replscript

因此,該程序看起來像:

type input1.csv | call :replscript " " "" >> output1.csv 
type input2.csv | call :replscript " " "" >> output2.csv 
type input3.csv | call :replscript " " "" >> output3.csv 

exit /b 

:replscript 
    echo In replscript 
exit /b 

,瞧,我們得到了預期的錯誤!

+2

批處理文件的線程是衆所周知的,看看dbenham的[蛇遊戲](http://www.dostips.com/論壇/ viewtopic.php?噸= 4741)。批處理功能也可以用於管道。 – jeb

+0

@jeb感謝您的澄清。但是,如果我理解正確,在答案和蛇遊戲中的並行操作是使用批處理文件解釋器的兩個實例完成的,而不是在批處理文件解釋器內使用(不存在的!)並行執行支持。 – Melebius

4

就像Melebius說的那樣,直接調用管道中的標籤不起作用,因爲管道的每個部分都在新的cmd.exe環境中處理,並且將是parsed by the command line parser not the batch parser

但解決這個問題很簡單。
您不使用CALL,而是調用您自己的批處理文件並跳轉到您想要的功能。

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment 

::************ Batch portion *********** 
@echo off 
set "func=%~0" 
for /F "delims=\" %%X in ("%func:*\=%") do set "func=%%X" 
if ":" == "%func:~0,1%" (
    goto %func% 
) 
echo Main started 
type input1.csv | "%~d0\:replscript\..%~pnx0" " " "" > output1.csv 
exit /b 

:replscript 
{repl content blah blah} 

訣竅是這裏的"%~d0\:replscript\..%~pnx0"這將重新啓動目前的批處理文件,但它注入了函數的名稱到路徑。
示例(假設你的腳本c:\temp\myTest.bat):
然後腳本是restartet與c:\:replscript\..\temp\myTest.bat
這是cmd.exe的沒有問題的..將刪除路徑標籤內容

,並在批處理文件for /F "delims=\" %%X in ("%func:*\=%") do set "func=%%X"從腳本名稱僅提取函數名行的開始。

+0

嗨傑布,謝謝你的信息。真的很有幫助。我已根據您的建議更新了我的腳本,但它引發了另一個錯誤(ive更新了原始帖子)。謹慎評論? :) – tuckker

+0

@tuckker我編輯了我的答案,因爲repl-part獲得修改參數的問題。不要忘記將第一行添加到文件「@if(@X)...」中。現在:replscript函數被固定在第一個代碼塊 – jeb

+0

謝謝你的工作! :) – tuckker