Batch-File execution don´t work - looking for alternatives

Hello Katalon Users, Experts and Automation-Friends :wink:

I try to give you short frame which i´m currently working on.

In one of our test cases we have manual interactions between two steps. You need to remember the ID from the UI, open an XML-Template, add the ID to the “place holder”, save it with a new name and copy it to a specific folder.

For this test case my idea was to handover the ID as an variable to an Windows-Batch File, which can replace the value from the XML-Template, create an new file and move/copy it to the specific folder.

The Batch file (call, parameter and move):

call TransformContentviaBatch.bat VAR1 VAR3
move Output.xml "C:\Users\Demo\Export.xml"

The Batch file (for transforming):

@echo off
setlocal enabledelayedexpansion
set INTEXTFILE=Input.xml
set OUTTEXTFILE=Output.xml
set SEARCHTEXT=%1
set REPLACETEXT=%2

for /f "tokens=1,* delims=¶" %%A in ( '"findstr /n ^^ %INTEXTFILE%"') do (
   SET string=%%A
   for /f "delims=: tokens=1,*" %%a in ("!string!") do set "string=%%b"
   if  "!string!" == "" (
       echo.>>%OUTTEXTFILE%
   ) else (
      SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
      echo !modified! >> %OUTTEXTFILE%
  )
)

I really try everything to execute these batch files or any batch file:
(https://docs.katalon.com/katalon-studio/docs/execute-windows-commands.html)

import static com.kms.katalon.core.checkpoint.CheckpointFactory.findCheckpoint
import static com.kms.katalon.core.testcase.TestCaseFactory.findTestCase
import static com.kms.katalon.core.testdata.TestDataFactory.findTestData
import static com.kms.katalon.core.testobject.ObjectRepository.findTestObject
import com.kms.katalon.core.checkpoint.Checkpoint as Checkpoint
import com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW
import com.kms.katalon.core.mobile.keyword.MobileBuiltInKeywords as Mobile
import com.kms.katalon.core.model.FailureHandling as FailureHandling
import com.kms.katalon.core.testcase.TestCase as TestCase
import com.kms.katalon.core.testdata.TestData as TestData
import com.kms.katalon.core.testobject.TestObject as TestObject
import com.kms.katalon.core.webservice.keyword.WSBuiltInKeywords as WS
import com.kms.katalon.core.webui.keyword.WebUiBuiltInKeywords as WebUI
import internal.GlobalVariable as GlobalVariable
import org.codehaus.groovy.runtime.StringGroovyMethods
import com.kms.katalon.core.configuration.RunConfiguration
/**
 * Execute a batch file situated in the KS project directory.
 * @param batchFile (String) e.g. "myfile.bat"
 */
static void runBatchFile(String batchFile) {
  String bf = RunConfiguration.getProjectDir() + '/' + batchFile
  WebUI.comment("Running batch file: " + bf)
  Runtime.runtime.exec(bf)
}

runBatchFile "test.bat"

Katalon result:

11-27-2018 10:56:36 PM - [START]  - Start Test Case : Test Cases/PTS_INST/General/CopyJob2_test
11-27-2018 10:56:36 PM - [INFO]   - Evaluating variables for test case
11-27-2018 10:56:36 PM - [START]  - Start action : Statement - Script1543355783544.runBatchFile(test.bat)
11-27-2018 10:56:36 PM - [END]    - End action : Statement - Script1543355783544.runBatchFile(test.bat)
11-27-2018 10:56:36 PM - [START]  - Start action : Statement - bf = com.kms.katalon.core.configuration.RunConfiguration.getProjectDir() + "/" + batchFile
11-27-2018 10:56:36 PM - [END]    - End action : Statement - bf = com.kms.katalon.core.configuration.RunConfiguration.getProjectDir() + "/" + batchFile
11-27-2018 10:56:36 PM - [START]  - Start action : comment
11-27-2018 10:56:36 PM - [INFO]   - Running batch file: C:/Users/Demo Laptop/Katalon Studio/DemoLaptop/test.bat
11-27-2018 10:56:36 PM - [END]    - End action : comment
11-27-2018 10:56:36 PM - [START]  - Start action : Statement - runtime.exec(bf)
11-27-2018 10:56:36 PM - [END]    - End action : Statement - runtime.exec(bf)
11-27-2018 10:56:36 PM - [PASSED] - Test Cases/PTS_INST/General/CopyJob2_test
11-27-2018 10:56:36 PM - [END]    - End Test Case : Test Cases/PTS_INST/General/CopyJob2_test


No error or something happens. This test.bat is stored directly inside the project directory and got the following content:

echo off
cls
echo. 
echo ERFOLG !!!!
echo.
pause

I open to any solution, inside the code, working batch file etc.

Thanks for reading my long story & Thanks for support

Christian

Please show us an example Input.xml content. And show us what Output.xml you expect produced by TransformContentviaBatch.bat with the example Input.xml.

for /f "tokens=1,* delims=¶"

In the batch file, you have a strange character ‘¶’. Are you sure?

kazurayam said:

Please show us an example Input.xml content. And show us what Output.xml you expect produced by TransformContentviaBatch.bat with the example Input.xml.

<CSC:SctScfBlkCdtTrf xmlns:CSC="urn:SctSCF:xsd:$SctScfBlkCdtTrf" xmlns="urn:iso:std:iso:20022:tech:xsd:camt.029.001.03">
	<CSC:SndgInst>CLEARINGXXX</CSC:SndgInst>
	<CSC:RcvgInst>CMCIDEDDXXX</CSC:RcvgInst>
    <CSC:SrvcID>INS</CSC:SrvcID>
    <CSC:TstCode>P</CSC:TstCode>
    <CSC:FType>SCF</CSC:FType>
	<CSC:FileRef>0000000001921008</CSC:FileRef>
    <CSC:RoutingInd>DIR</CSC:RoutingInd>
	<CSC:FileBusDt>2017-08-10</CSC:FileBusDt>
    <CSC:FileCycleNo>05</CSC:FileCycleNo>
	<CSC:RsltnOfInvstgtn>
        <Assgnmt>
            <Id>12312</Id>
            <Assgnr>
                <Agt>
                    <FinInstnId>
                        <BIC>CMCIDEDDXXX</BIC>
                    </FinInstnId>
                </Agt>
            </Assgnr>
            <Assgne>
                <Agt>
                    <FinInstnId>
                        <BIC>MARKDEFF</BIC>
                    </FinInstnId>
                </Agt>
            </Assgne>
            <CreDtTm>2017-08-02T17:30:00.292+02:00</CreDtTm>
        </Assgnmt>
        <Sts>
            <Conf>RJCR</Conf>
        </Sts>
        <CxlDtls>
            <TxInfAndSts>
                <CxlStsId>123132</CxlStsId>
                <OrgnlGrpInf>
                    <OrgnlMsgId>MSG12345678</OrgnlMsgId>
                    <OrgnlMsgNmId>pacs.008.001.02</OrgnlMsgNmId>
                </OrgnlGrpInf>
                <OrgnlEndToEndId>REF1432423</OrgnlEndToEndId>
                <OrgnlTxId>VAR1</OrgnlTxId>
                <TxCxlSts>RJCR</TxCxlSts>
                <CxlStsRsnInf>
                    <Orgtr>
                        <Id>
                            <OrgId>
                                <BICOrBEI>CMCIDEDDXXX</BICOrBEI>
                            </OrgId>
                        </Id>
                    </Orgtr>
                    <Rsn>
                        <Prtry>NOOR</Prtry>
                    </Rsn>
                </CxlStsRsnInf>
                <OrgnlTxRef>
                    <IntrBkSttlmAmt Ccy="EUR">50.00</IntrBkSttlmAmt>
                    <IntrBkSttlmDt>2018-10-23</IntrBkSttlmDt>
                    <SttlmInf>
                        <SttlmMtd>CLRG</SttlmMtd>
                    </SttlmInf>
					<Dbtr>
						<Nm>Joe Johnson</Nm>
						<PstlAdr>
							<Ctry>DE</Ctry>
							<AdrLine>Longest Str. 35</AdrLine>
							<AdrLine>Munich, Germany</AdrLine>
						</PstlAdr>
					</Dbtr>
                    <DbtrAcct>
                        <Id>
                            <IBAN>DE13300209005001360096</IBAN>
                        </Id>
                    </DbtrAcct>
					<DbtrAgt>
						<FinInstnId>
							<BIC>CMCIDEDD</BIC>
						</FinInstnId>
					</DbtrAgt>
					<CdtrAgt>
						<FinInstnId>
							<BIC>COBADEFF</BIC>
						</FinInstnId>
					</CdtrAgt>
					<Cdtr>
						<Nm>Bill Morgan</Nm>
						<PstlAdr>
							<Ctry>DE</Ctry>
							<AdrLine>Widest Str. 45, 80333</AdrLine>
							<AdrLine>Munich, Germany</AdrLine>
						</PstlAdr>
					</Cdtr>
                    <CdtrAcct>
                        <Id>
                            <IBAN>DE75300209005001420090</IBAN>
                        </Id>
                    </CdtrAcct>
                </OrgnlTxRef>
            </TxInfAndSts>
        </CxlDtls>
	</CSC:RsltnOfInvstgtn>
</CSC:SctScfBlkCdtTrf>

This is the complete XML File. The Value “VAR1” should be replaced by “VAR2”, which will be provided by Katalon.

If i´m doing it using only the Batch-Files, it works. I get an perfect working expected result and can use it in my application and verify the final expected result in my UI.

This is the expected result from output file:

<?xml version="1.0" encoding="utf-8"?> 
<CSC:SctScfBlkCdtTrf xmlns:CSC="urn:SctSCF:xsd:$SctScfBlkCdtTrf" xmlns="urn:iso:std:iso:20022:tech:xsd:camt.029.001.03"> 
	<CSC:SndgInst>CLEARINGXXX</CSC:SndgInst> 
	<CSC:RcvgInst>CMCIDEDDXXX</CSC:RcvgInst> 
    <CSC:SrvcID>INS</CSC:SrvcID> 
    <CSC:TstCode>P</CSC:TstCode> 
    <CSC:FType>SCF</CSC:FType> 
	<CSC:FileRef>0000000001921008</CSC:FileRef> 
    <CSC:RoutingInd>DIR</CSC:RoutingInd> 
	<CSC:FileBusDt>2017-08-10</CSC:FileBusDt> 
    <CSC:FileCycleNo>05</CSC:FileCycleNo> 
	<CSC:RsltnOfInvstgtn> 
        <Assgnmt> 
            <Id>12312</Id> 
            <Assgnr> 
                <Agt> 
                    <FinInstnId> 
                        <BIC>CMCIDEDDXXX</BIC> 
                    </FinInstnId> 
                </Agt> 
            </Assgnr> 
            <Assgne> 
                <Agt> 
                    <FinInstnId> 
                        <BIC>MARKDEFF</BIC> 
                    </FinInstnId> 
                </Agt> 
            </Assgne> 
            <CreDtTm>2017-08-02T17:30:00.292+02:00</CreDtTm> 
        </Assgnmt> 
        <Sts> 
            <Conf>RJCR</Conf> 
        </Sts> 
        <CxlDtls> 
            <TxInfAndSts> 
                <CxlStsId>123132</CxlStsId> 
                <OrgnlGrpInf> 
                    <OrgnlMsgId>MSG12345678</OrgnlMsgId> 
                    <OrgnlMsgNmId>pacs.008.001.02</OrgnlMsgNmId> 
                </OrgnlGrpInf> 
                <OrgnlEndToEndId>REF1432423</OrgnlEndToEndId> 
                <OrgnlTxId>VAR3</OrgnlTxId> 
                <TxCxlSts>RJCR</TxCxlSts> 
                <CxlStsRsnInf> 
                    <Orgtr> 
                        <Id> 
                            <OrgId> 
                                <BICOrBEI>CMCIDEDDXXX</BICOrBEI> 
                            </OrgId> 
                        </Id> 
                    </Orgtr> 
                    <Rsn> 
                        <Prtry>NOOR</Prtry> 
                    </Rsn> 
                </CxlStsRsnInf> 
                <OrgnlTxRef> 
                    <IntrBkSttlmAmt Ccy="EUR">50.00</IntrBkSttlmAmt> 
                    <IntrBkSttlmDt>2018-10-23</IntrBkSttlmDt> 
                    <SttlmInf> 
                        <SttlmMtd>CLRG</SttlmMtd> 
                    </SttlmInf> 
					<Dbtr> 
						<Nm>Joe Johnson</Nm> 
						<PstlAdr> 
							<Ctry>DE</Ctry> 
							<AdrLine>Longest Str. 35</AdrLine> 
							<AdrLine>Munich, Germany</AdrLine> 
						</PstlAdr> 
					</Dbtr> 
                    <DbtrAcct> 
                        <Id> 
                            <IBAN>DE13300209005001360096</IBAN> 
                        </Id> 
                    </DbtrAcct> 
					<DbtrAgt> 
						<FinInstnId> 
							<BIC>CMCIDEDD</BIC> 
						</FinInstnId> 
					</DbtrAgt> 
					<CdtrAgt> 
						<FinInstnId> 
							<BIC>COBADEFF</BIC> 
						</FinInstnId> 
					</CdtrAgt> 
					<Cdtr> 
						<Nm>Bill Morgan</Nm> 
						<PstlAdr> 
							<Ctry>DE</Ctry> 
							<AdrLine>Widest Str. 45, 80333</AdrLine> 
							<AdrLine>Munich, Germany</AdrLine> 
						</PstlAdr> 
					</Cdtr> 
                    <CdtrAcct> 
                        <Id> 
                            <IBAN>DE75300209005001420090</IBAN> 
                        </Id> 
                    </CdtrAcct> 
                </OrgnlTxRef> 
            </TxInfAndSts> 
        </CxlDtls> 
	</CSC:RsltnOfInvstgtn> 
</CSC:SctScfBlkCdtTrf> 


Only VAR3 is changed. Okay, in real situation its an ID. But I guess you can see what is the idea behind it.

Update:
I find a solution, maybe a bit strange, but it works :slight_smile:

ContentReplace = 'Test123'
CreateFile = new File('Path\\Test.xml')
CreateFile.append('<?xml version="1.0" encoding="utf-8"?><CSC:SctScfBlkCdtTrf xmlns:CSC="urn:SctSCF:xsd:$SctScfBlkCdtTrf" xmlns="urn:iso:std:iso:20022:tech:xsd:camt.029.001.03"><CSC:SndgInst>CLEARINGXXX</CSC:SndgInst><CSC:RcvgInst>CMCIDEDDXXX</CSC:RcvgInst><CSC:SrvcID>INS</CSC:SrvcID><CSC:TstCode>P</CSC:TstCode><CSC:FType>SCF</CSC:FType><CSC:FileRef>0000000001921008</CSC:FileRef><CSC:RoutingInd>DIR</CSC:RoutingInd><CSC:FileBusDt>2017-08-10</CSC:FileBusDt><CSC:FileCycleNo>05</CSC:FileCycleNo><CSC:RsltnOfInvstgtn><Assgnmt><Id>12312</Id><Assgnr><Agt><FinInstnId><BIC>CMCIDEDDXXX</BIC></FinInstnId></Agt></Assgnr><Assgne><Agt><FinInstnId><BIC>MARKDEFF</BIC></FinInstnId></Agt></Assgne><CreDtTm>2017-08-02T17:30:00.292+02:00</CreDtTm></Assgnmt><Sts><Conf>RJCR</Conf></Sts><CxlDtls><TxInfAndSts><CxlStsId>123132</CxlStsId><OrgnlGrpInf><OrgnlMsgId>MSG12345678</OrgnlMsgId><OrgnlMsgNmId>pacs.008.001.02</OrgnlMsgNmId></OrgnlGrpInf><OrgnlEndToEndId>REF1432423</OrgnlEndToEndId><OrgnlTxId>')
CreateFile.append(ContentReplace)
CreateFile.append('</OrgnlTxId><TxCxlSts>RJCR</TxCxlSts><CxlStsRsnInf><Orgtr><Id><OrgId><BICOrBEI>CMCIDEDDXXX</BICOrBEI></OrgId></Id></Orgtr><Rsn><Prtry>NOOR</Prtry></Rsn></CxlStsRsnInf><OrgnlTxRef><IntrBkSttlmAmt Ccy="EUR">50.00</IntrBkSttlmAmt><IntrBkSttlmDt>2018-10-23</IntrBkSttlmDt><SttlmInf><SttlmMtd>CLRG</SttlmMtd></SttlmInf><Dbtr><Nm>Joe Johnson</Nm><PstlAdr><Ctry>DE</Ctry><AdrLine>Longest Str. 35</AdrLine><AdrLine>Munich, Germany</AdrLine></PstlAdr></Dbtr><DbtrAcct><Id><IBAN>DE13300209005001360096</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BIC>CMCIDEDD</BIC></FinInstnId></DbtrAgt><CdtrAgt><FinInstnId><BIC>COBADEFF</BIC></FinInstnId></CdtrAgt><Cdtr><Nm>Bill Morgan</Nm><PstlAdr><Ctry>DE</Ctry><AdrLine>Widest Str. 45, 80333</AdrLine><AdrLine>Munich, Germany</AdrLine></PstlAdr></Cdtr><CdtrAcct><Id><IBAN>DE75300209005001420090</IBAN></Id></CdtrAcct></OrgnlTxRef></TxInfAndSts></CxlDtls></CSC:RsltnOfInvstgtn></CSC:SctScfBlkCdtTrf>')

Here I propose an alternative Test Case implementation in Groovy. This code will

  1. read <projectdir>/Input.xml,
  2. in the content string, replace ‘<OrgnlTxId>something</OrgnlTxId>’ string into ‘<OrgnlTxId>whatever you want </OrgnlTxId>’ using Reglar Expression,
  3. and write the product into <projectdir>/Output.xml.
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import com.kms.katalon.core.configuration.RunConfiguratio
Path projectDir = Paths.get(RunConfiguration.getProjectDir())
Path inputXML = projectDir.resolve('Input.xml')
Path outputXML = projectDir.resolve('Output.xml')

// load Input.xml into a String
String content = inputXML.toFile().getText()

// do String manipulation
String value = 'VAR4'
String replaced = content.replaceAll(
    '<OrgnlTxId>\\w+</OrgnlTxId>',
    "<OrgnlTxId>${value}</OrgnlTxId>")
// save the String into Output.xml
Files.createDirectories(outputXML.getParent())
outputXML.toFile().write(replaced)
System.out.println("PLS find the output at ${outputXML.toString()}")
3 Likes

That works perfect :slight_smile: Thank you!