powershell批處理io校驗(yàn)功能
powershell批處理——io校驗(yàn)
在刷題時(shí),時(shí)?;叵?,OJ平臺(tái)是如何校驗(yàn)競(jìng)賽隊(duì)員提交的代碼的,OJ平臺(tái)并不看代碼,而是使用“黑盒測(cè)試”,用測(cè)試數(shù)據(jù)來驗(yàn)證。對(duì)于每題,都事先設(shè)定了很多組輸入數(shù)據(jù)(datain)和輸出數(shù)據(jù)(dataout),OJ主要是看輸入datain,看產(chǎn)生的輸出是否與dataout一致。
如果需要一次性知道自己的所有測(cè)試輸入數(shù)據(jù)是否能得到正確輸出,一個(gè)一個(gè)測(cè)試就太慢了,批處理操作就能很好解決這個(gè)問題。剛好在學(xué)習(xí)powershell,本篇文章主要介紹一下這個(gè)ioCode項(xiàng)目。
項(xiàng)目目錄結(jié)構(gòu)

- input目錄:存放輸入數(shù)據(jù)文件,以
.in后綴結(jié)尾 - output目錄:存放輸出數(shù)據(jù)文件,以
.out后綴結(jié)尾,每個(gè)輸出的文件名與對(duì)應(yīng)的輸入的文件名相同 - start.ps1:編寫的腳本文件
start.ps1源代碼:
function ioCheck{
param(
$content, #程序輸出內(nèi)容
$answer #輸出的答案內(nèi)容
)
$cnt = $answer.length
if($content.length -ne $cnt){
return -1 #行數(shù)不一致返回-1
}
for($i=0;$i -lt $cnt;$i++){
if($answer[$i] -ne $content[$i]){
return $i+1 #內(nèi)容不一致,返回第一個(gè)不同的行數(shù)
}
}
return 0 #相同返回0
}
function ioCode{
param(
[string]$command,
[string]$inPath = './input',
[string]$outPath = './output'
)
$allStartTime = Get-Date
$acList = New-Object System.Collections.ArrayList #創(chuàng)建正確輸出的文件名集合
$errList = New-Object System.Collections.ArrayList #創(chuàng)建錯(cuò)誤輸出的文件名集合
$inFiles = Get-ChildItem -Path $inPath -Filter *.in #獲取輸入文件集
$len = $inFiles.length
$cnt = 0
foreach($file in $inFiles){
try {
$startTime = Get-Date
$fullOut = (cmd.exe /c "$command < $($file.fullName)") -split "\r\n|\r|\n" #獲取程序?qū)嶋H輸出內(nèi)容
$endTime = Get-Date
$duration = $endTime - $startTime #獲取程序執(zhí)行時(shí)間
$answerPath = Join-Path -Path $outPath -ChildPath ($file.BaseName + '.out')
$answer = Get-Content -Path $answerPath -ReadCount 0 #獲取該輸入文件的對(duì)應(yīng)輸出文件的內(nèi)容,-ReadCount 0指定返回一個(gè)字符串?dāng)?shù)組
$res = ioCheck $fullOut $answer
if($res -eq 0){
$item = @{
fileName = $file.Name
exeTime = $duration
}
$acList.add($item) | Out-Null #Out-Null表示丟棄輸出
$cnt++
}else{
$item = @{
fileName = $file.Name
errLine = $res
}
$errList.add($item) | Out-Null
}
}
catch {
Write-Host "處理文件 $($file.Name) 時(shí)出現(xiàn)錯(cuò)誤: $_"
}
}
$allEndTime = Get-Date
$allExeTime = $allEndTime-$allStartTime
Write-Host "正確輸出 $cnt/$len:,總耗時(shí):$($allExeTime.Milliseconds)ms"
foreach($item in $acList){
Write-Host "Y: $($item.fileName) 耗時(shí):$($item.exeTime.Milliseconds)ms"
}
foreach($item in $errList){
Write-Host "N: $($item.fileName) errCode:$($item.errLine)"
}
return @{
CorrectCount = $cnt
TotalCount = $len
acList = $acList
errList = $errList
}
}首先測(cè)試輸入兩個(gè)數(shù),看能否成功輸出兩數(shù)之和
在input目錄中創(chuàng)建三個(gè)文件分別為001.in,002.in,003.in
內(nèi)容分別為
3 4
35749 47985
544 6755
對(duì)應(yīng)的在output目錄創(chuàng)建三個(gè)同名的.out文件,分別為001.out,002.out,003.out
內(nèi)容就是對(duì)應(yīng).in文件中兩個(gè)輸入數(shù)據(jù)的相加的結(jié)果。
使用
編寫好測(cè)試用例,就是可以測(cè)試我們寫好的代碼了,這里不僅可以測(cè)試C/C++生成的.exe可執(zhí)行文件,還可以測(cè)試java生成的.class可執(zhí)行字節(jié)碼文件(前提是電腦具備java環(huán)境)。
測(cè)試.exe文件
在當(dāng)前目錄下準(zhǔn)備一個(gè)test.cpp文件,代碼如下:
#include<iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout<< 7;
return 0;
}將其編譯為可執(zhí)行文件test.exe:
g++ -o test.exe test.cpp
在當(dāng)前目錄下打開powershell控制臺(tái)
通過點(diǎn)加載start.ps1文件
. './start.ps1'
輸入命令ioCode {command} {inPath} {outPath},command為可執(zhí)行命令,inPath為輸入文件目錄(默認(rèn)為當(dāng)前目錄的input目錄),outPath為輸出答案文件目錄(默認(rèn)為當(dāng)前目錄的output目錄)
ioCode test.exe
示例:

控制臺(tái)輸出顯示我們的三個(gè)測(cè)試用例都通過了。
測(cè)試可執(zhí)行.class文件
在當(dāng)前目錄下準(zhǔn)備一個(gè)Main.java文件,代碼如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(a+b);
}
}將其編譯為可執(zhí)行文件Main.class:
javac Main.java
在當(dāng)前目錄下打開powershell控制臺(tái)
通過點(diǎn)加載start.ps1文件
. './start.ps1'
輸入命令ioCode {command} {inPath} {outPath},command為可執(zhí)行命令,inPath為輸入文件目錄(默認(rèn)為當(dāng)前目錄的input目錄),outPath為輸出答案文件目錄(默認(rèn)為當(dāng)前目錄的output目錄)
ioCode 'java Main' #注意java Main是一個(gè)完整的命令,中間帶有空格,需要用引號(hào)引起來
示例:

測(cè)試可執(zhí)行.py文件
在當(dāng)前目錄下準(zhǔn)備一個(gè)Main.java文件,代碼如下:
a,b=map(int,input().split()) print(a+b)
在當(dāng)前目錄下打開powershell控制臺(tái)
通過點(diǎn)加載start.ps1文件
. './start.ps1'
輸入命令ioCode {command} {inPath} {outPath},command為可執(zhí)行命令,inPath為輸入文件目錄(默認(rèn)為當(dāng)前目錄的input目錄),outPath為輸出答案文件目錄(默認(rèn)為當(dāng)前目錄的output目錄)
ioCode 'python test.py' #注意python test.py是一個(gè)完整的命令,中間帶有空格,需要用引號(hào)引起來
示例:

以上就是這個(gè)小項(xiàng)目的內(nèi)容,通過ioCode可以批處理測(cè)試多個(gè)輸入輸出用例,并能清晰的看到哪些輸入文件正確輸出方便DeBug。
到此這篇關(guān)于powershell批處理——io校驗(yàn)的文章就介紹到這了,更多相關(guān)powershell批處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PowerShell數(shù)組結(jié)合switch語句產(chǎn)生的奇特效果介紹
這篇文章主要介紹了PowerShell數(shù)組結(jié)合switch語句產(chǎn)生的奇特效果介紹,產(chǎn)生了類似枚舉的效果,需要的朋友可以參考下2014-08-08
Powershell使用WPF技術(shù)實(shí)現(xiàn)彈窗提示實(shí)例
這篇文章主要介紹了Powershell使用WPF技術(shù)實(shí)現(xiàn)彈窗提示實(shí)例,需要的朋友可以參考下2014-05-05
PowerShell中定義哈希散列(Hash)和調(diào)用例子
這篇文章主要介紹了PowerShell中定義哈希散列(Hash)和調(diào)用例子,本文介紹在PowerShell中如何創(chuàng)建一個(gè)哈希變量,并且使用哈希變量,需要的朋友可以參考下2014-08-08
PowerShell中調(diào)用WPF生成炫酷窗口實(shí)例
這篇文章主要介紹了PowerShell中調(diào)用WPF生成炫酷窗口實(shí)例,本文直接給出運(yùn)行效果和腳本源碼,需要的朋友可以參考下2015-03-03
使用 powershell 創(chuàng)建虛擬機(jī)
Azure PowerShell 模塊用于從 PowerShell 命令行或腳本創(chuàng)建和管理 Azure 資源。 本指南詳細(xì)介紹了如何使用 Azure PowerShell 模塊創(chuàng)建虛擬機(jī)。2017-10-10
自動(dòng)設(shè)置安卓手機(jī)wifi代理的PowerShell腳本
這篇文章主要介紹了自動(dòng)設(shè)置安卓手機(jī)wifi代理的PowerShell腳本,幫助大家進(jìn)行抓包測(cè)試,感興趣的朋友可以了解下2020-10-10
PowerShell腳本開發(fā)之收發(fā)TCP消息包
這篇文章里將會(huì)描述如何在PSNet包中創(chuàng)建針對(duì)TCP消息包的函數(shù)Receive-和TCPMessageSend-TCPMessage。并把相關(guān)代碼分享給大家,有需要的朋友可以參考下。2014-10-10
PowerShell腳本trap語句捕獲異常寫法實(shí)例
這篇文章主要介紹了PowerShell腳本trap語句捕獲異常寫法實(shí)例,包含幾個(gè)代碼實(shí)例,需要的朋友可以參考下2014-07-07
用PowerShell刪除N天前或指定日期(前后)創(chuàng)建(或修改)的文件
這篇文章主要介紹了用PowerShell刪除N天前或指定日期(前后)創(chuàng)建(或修改)的文件,需要的朋友可以參考下2016-11-11

