【问题标题】:Executing Perl within Batch, then using a scalar from Perl script in subsequent Batch command在批处理中执行 Perl,然后在后续批处理命令中使用 Perl 脚本中的标量
【发布时间】:2018-04-02 16:54:14
【问题描述】:

我对 Batch 和 Perl 真的很陌生,所以如果我以错误的方式解决我的问题,请见谅。我现在的任务是一步一步来的:

  1. 执行将生成批处理文件的 Perl 脚本。
  2. 执行批处理文件时,将使用adddiffs new (...) 创建协作者审核,然后使用addfiles (...) 添加文件

目前的问题是,有时评论创建过程会因任何原因而失败(我没有真正告诉过为什么,只是确实如此)但尽管adddiffs 命令失败,addfiles last(目前就是这样coded) 仍然会执行,最终会将文件添加到错误的审阅中。例如,我正在尝试创建评论 10,但评论创建失败并且文件最终被添加到评论 9,这显然不是我们想要的。

我正在尝试将adddiffs new 的输出转储到一个文本文件中,然后我使用一些 perl 脚本提取评论#。然后我想做的是使用提取的评论 # 来执行 addfiles reviewNum 而不是 addfiles last 因为看起来 addfiles last 可能会导致意外行为。

我的批处理文件是什么样的:

@rem= 'PERL for Windows NT
@echo off

ccollab.exe adddiffs new Original_Files Changed_Files > output.txt
C:\Perl\bin\perl GenerateReview.bat%*
goto endofperl
@rem ';

open(TXT, "output.txt") or die; 
$lastLine = "";
while ($line = <TXT>) {
    $lastLine = $line;
}

($revNum) = $lastLine =~ /(\d+)/ig;
close TXT;

__END__
:endofperl
ccollab.exe addfiles $revNum *.txt *.pdf *.html *.doc* *.xls* Info_Only/*
pause

有没有办法可以从 perl 脚本中获取 $revNum 并将其替换为我的 addfiles 命令?

【问题讨论】:

  • 你能详细说明你需要什么吗?示例输入和输出是什么样的?
  • @Yserbius 从技术上讲,输入并不重要,因为脚本只是读取 Original_Files 和 Changed_Files 目录中的文件。至于输出,当ccollab.exe adddiffs new Original_Files Changed_Files &gt; output.txt被执行时,它应该生成output.txt文件,如果成功将是Changes successfully attached to Review 10。作为最后一行。然后 perl 脚本将运行并获取10。到目前为止,这部分似乎有效;我试图弄清楚如何获取评论编号并将其传递给下一个批处理命令ccollab.exe addfiles $revNum (...)

标签: perl batch-file code-collaborator


【解决方案1】:

可以这样做(未测试):

@echo off
ccollab.exe adddiffs new Original_Files Changed_Files > output.txt
set REVNUM=
for /f "delims=" %%a in ('C:\Perl\bin\perl -x "%~f0"') do set REVNUM=%%~a
if defined REVNUM (
  ccollab.exe addfiles %REVNUM% *.txt *.pdf *.html *.doc* *.xls* Info_Only/*
) else (
  echo REVNUM not found! check the contents of output.txt!
)
pause
goto :eof
#!perl
#line 14
use strict;use warnings;
open(TXT, "output.txt") or die; 
my $lastLine = "";
while (my $line = <TXT>) {
    $lastLine = $line;
}
my($revNum) = $lastLine =~ /(\d+)/ig;
close TXT;
print $revNum;

Perl 的输出被捕获到 REVNUM 变量中,稍后在运行 ccollab.exe 时使用。

如果我们将 output.txt 作为参数传递给 perl,脚本可以简化为:

for /f "delims=" %%a in ('C:\Perl\bin\perl -x "%~f0" output.txt') do set REVNUM=%%~a
...
#!perl -w 
print +( map { /(\d+)/ && $1 } <> )[-1];

如果我们将 perl 代码内联,它会更加紧凑:

@echo off
ccollab.exe adddiffs new Original_Files Changed_Files > output.txt
set REVNUM=
for /f "delims=" %%a in ('C:\Perl\bin\perl -e "print +( map { /(\d+)/ && $1 } <> )[-1]" output.txt ') do set REVNUM=%%~a
if defined REVNUM (
  ccollab.exe addfiles %REVNUM% *.txt *.pdf *.html *.doc* *.xls* Info_Only/*
) else (
  echo REVNUM not found! check the contents of output.txt!
)
pause

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2018-11-07
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多