Discussion forum for all Windows batch related topics.
Moderator: DosItHelp
-
SIMMS7400
- Posts: 546
- Joined: 07 Jan 2016 07:47
#1
Post
by SIMMS7400 » 06 Feb 2022 05:19
Hi Guys -
I have the following piece of code that I need to spool to another batch script. However, when I redirect, the functions/variables are done so expanded which isn't right.
I need to pool this piece of code to "Testbatch.cmd":
Code: Select all
>>"..\Batch\TestBatch.cmd" (
@ECHO OFF
SET "Script=%~n0"
FOR /F %%a IN ('POWERSHELL.exe -c "(Get-Date).ToString('MM.dd.yyyy-HH.mm.ss')"') DO SET "LogTime=%%a"
FOR /F %%i IN ('POWERSHELL.exe -c "(Get-Random -Minimum 0 -Maximum 99999).ToString('00000')"') DO SET "ID=%%i"
pwsh.exe -executionpolicy bypass -c "& {try{& '..\ps1\%Script%.ps1' %LogTime% %Script% %ID%}catch{exit 1}}"
)
And so, the end results, but look exactly like what's being spooled. How would I go about doing that?
-
T3RRY
- Posts: 250
- Joined: 06 May 2020 10:14
#2
Post
by T3RRY » 06 Feb 2022 05:43
Escape the Percent characters with themselves for any variables you don't want expanded
-
SIMMS7400
- Posts: 546
- Joined: 07 Jan 2016 07:47
#3
Post
by SIMMS7400 » 06 Feb 2022 05:54
THanks, Terry!
That did the trick, but having one issue where when trying to redirect a for loop command, it's recognizing the DO. Here is my almost finished code:
Code: Select all
@ECHO OFF
REM Read PS1 files from this directory
PUSHD "..\PS1"
FOR %%A IN ("*") DO (
REM Ensure cmd is purged before writing to it
DEL /F /Q "..\Batch\%%~nA.cmd" >nul 2>&1
REM Spool the below contents to the batch file using the PS1 name
>>"..\Batch\%%~nA.cmd" (
ECHO @ECHO OFF
ECHO(
ECHO(::-- Set Script Name --::
ECHO(SET "Script=%%~n0"
ECHO(
ECHO(::-- Set Log Time --::
REM ECHO(FOR /F %%a IN ('POWERSHELL.exe -c "(Get-Date).ToString('MM.dd.yyyy-HH.mm.ss')"') DO SET "LogTime=%%%%a"
ECHO(
ECHO(::-- Set Randomly Generated ID --::
REM ECHO(FOR /F %%a IN ('POWERSHELL.exe -c "(Get-Random -Minimum 0 -Maximum 99999).ToString('00000')"') DO SET "ID=%%%%a"
ECHO(
ECHO(::-- Execute Powershell Routine --::
ECHO pwsh.exe -executionpolicy bypass -c "& {try{& '..\ps1\%%Script%%.ps1' %%LogTime%% %%Script%% %%ID%%}catch{exit 1}}"
)
)
POPD
pause
Please see the two lines with REM. How do I successfully redirect that? If I put those two lines out of that overall for loop and reidrect there are no issues. Seems to be because I"m trying to redirect within a for loop.
-
T3RRY
- Posts: 250
- Joined: 06 May 2020 10:14
#4
Post
by T3RRY » 06 Feb 2022 08:42
Thats another escaping issue. When redirecting from within a parenthesised code block, closing parentheses to be output need caret escaping. likewise, Pipes, redirectors and ampersands that are intended to be output literally need caret escaping.
A somewhat simpler way is described here:
https://stackoverflow.com/a/68692713/12343998
-
Squashman
- Expert
- Posts: 4486
- Joined: 23 Dec 2011 13:59
#5
Post
by Squashman » 06 Feb 2022 10:01
And here is where we discussed with you about escaping the parentheses.
viewtopic.php?t=8282
I bet if I do another search I will find another thread of yours where we explained escaping the percent symbols.
Regardless this site has discussed escaping the percent symbol ad nauseum. I would think with as many years you have been on this site that you would occasionally be reading the majority of questions and answers on this site when you have a bit of free time to further your skill set to help yourself and help others on this site by answering their questions.
Just reading through alot of your threads you have been told plenty of times about escaping special characters. The pipe in for commands. How to use the escape character in the findstr command. This is not a new concept to you. A simple search would have found an answer for you.
-
SIMMS7400
- Posts: 546
- Joined: 07 Jan 2016 07:47
#6
Post
by SIMMS7400 » 11 Feb 2022 10:34
HI Squash & Team -
Yes, you're right. I'm sorry. It was the last paren in the for loop causing the issue, I should have known.
Final :
Code: Select all
SETLOCAL ENABLEDELAYEDEXPANSION
SET "EXCLUSION_LIST=Automation_Parameters.ps1,Encrypt_Credentials.ps1,Download_Backup.ps1"
SET "EXT=cmd"
REM Read PS1 files from this directory
PUSHD "..\PS1"
FOR %%A IN ("*") DO (
SET "SKIP="
ECHO "%%~A" | FINDSTR "%EXCLUSION_LIST:,= %" >nul 2>&1 && ( SET "SKIP=1" )
IF NOT DEFINED SKIP (
SET "CREATED_LIST=%%~A !CREATED_LIST!"
REM Spool the below contents to the batch file using the PS1 name
>"..\Batch\%%~nA.%EXT%" (
ECHO @ECHO OFF
ECHO(
ECHO(::-- Set Script Name --::
ECHO(SET "SCRIPT=%%~n0"
ECHO(
ECHO(::-- Set Log Time --::
ECHO(FOR /F %%%%a IN ('POWERSHELL.exe -c "(Get-Date).ToString('MM.dd.yyyy-HH.mm.ss')"'^) DO SET "LOGTIME=%%%%a"
ECHO(
ECHO(::-- Set Randomly Generated ID --::
ECHO(FOR /F %%%%a IN ('POWERSHELL.exe -c "(Get-Random -Minimum 0 -Maximum 99999).ToString('00000')"'^) DO SET "ID=%%%%a"
ECHO(
ECHO(::-- Execute Powershell Routine --::
ECHO pwsh.exe -executionpolicy bypass -c "& {try{& '..\ps1\%%SCRIPT%%.ps1' %%LOGTIME%% %%SCRIPT%% %%ID%%}catch{exit 1}}"
)
)
)
POPD
ECHO The following PS1 scripts were converted to cmd:
ECHO %CREATED_LIST%
ECHO(
ECHO Press [Enter] to Exit
SET /P=
GOTO :EOF
Squash, you need to get a little honey on your stinger. But hey, if condescending internet posts get your jollys off, who am I to judge!
Happy Friday and hope everyone has a great weekend!