在 Batch 中执行 Perl,然后在后续 Batch 命令中使用 Perl 脚本中的标量
Executing Perl within Batch, then using a scalar from Perl script in subsequent Batch command
我是 Batch 和 Perl 的新手,所以如果我以错误的方式解决我的问题,请原谅。我现在的任务一步一步:
- 执行将生成批处理文件的 Perl 脚本。
- 执行批处理文件时,将使用
adddiffs new (...)
创建协作者审阅,然后使用 addfiles (...)
添加文件
目前的问题是有时评论创建过程会因任何原因失败(我没有真正告诉为什么,只是它确实如此)但是尽管 adddiffs
命令失败,addfiles last
(这是它当前的编码方式)仍将执行,最终将文件添加到错误的评论中。例如,我正在尝试创建评论 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
命令?
可以这样做(未测试):
@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];
如果我们将 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]" 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
我是 Batch 和 Perl 的新手,所以如果我以错误的方式解决我的问题,请原谅。我现在的任务一步一步:
- 执行将生成批处理文件的 Perl 脚本。
- 执行批处理文件时,将使用
adddiffs new (...)
创建协作者审阅,然后使用addfiles (...)
添加文件
目前的问题是有时评论创建过程会因任何原因失败(我没有真正告诉为什么,只是它确实如此)但是尽管 adddiffs
命令失败,addfiles last
(这是它当前的编码方式)仍将执行,最终将文件添加到错误的评论中。例如,我正在尝试创建评论 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
命令?
可以这样做(未测试):
@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];
如果我们将 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]" 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