2017-01-05 1 views
0
variables

Je ne comprends pas pourquoi le lot suivant:« appel » ou <str> dans le script batch supprime malheureusement certains caractères d'une

REM echo off 
setlocal 
set u64=aDI0NDcxOQ== 
set p64=SGZzemxwNzc3 
call :atob usr "%u64%" 
call :atob pwd "%p64%" 
schtasks /Run /S aaa.bbb.ccc.ddd /U %usr% /P %pwd% /TN "My Scheduler Task Name" 
goto :EOF 

:atob <var_to_set> <str> 
for /f "delims=" %%I in (
    'powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"%~2\"))"' 
) do set %~1=%%I 
goto :EOF 

supprime les caractères les 2 dernières « = » de U64 comme vous pouvez le voir avec le résultat suivant:

C:\Users\lambda>REM echo off 
C:\Users\lambda>setlocal 
C:\Users\lambda>set u64=aDI0NDcxOQ== 
C:\Users\lambda>set p64=SGZzemxwNzc3 
C:\Users\lambda>call :atob usr "aDI0NDcxOQ==" 
C:\Users\lambda>for /F "delims=" %I in ('powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"aDI0NDcxOQ \"))"') do set usr=%I 
C:\Users\lambda>set usr=Exception calling "FromBase64String" with "1" argument(s): "Longueur non 
C:\Users\lambda>set usr=valide pour un tableau de caractères Base 64 ou une chaîne." 
C:\Users\lambda>set usr=At line:1 char:1 
C:\Users\lambda>set usr=+ [Text.Encoding]::UTF8.GetString([convert]::FromBase64String("aDI0NDcxOQ ")) 
C:\Users\lambda>set usr=+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
C:\Users\lambda>set usr= + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
C:\Users\lambda>set usr= + FullyQualifiedErrorId : FormatException 
C:\Users\lambda>set usr= 
C:\Users\lambda>goto :EOF 
C:\Users\lambda>call :atob pwd "SGZzemxwNzc3" 
C:\Users\lambda>for /F "delims=" %I in ('powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"SGZzemxwNzc3\"))"') do set pwd=%I 
C:\Users\lambda>set pwd=Hfszlp777 
C:\Users\lambda>goto :EOF 
C:\Users\lambda>schtasks /Run /S aaa.bbb.ccc.ddd /U /P Hfszlp777 /TN "My Scheduler Task Name" 
Erreur : Syntaxe incorrecte. Valeur attendue pour '/U'. 
Entrez "SCHTASKS /RUN /?" pour afficher la syntaxe. 
C:\Users\lambda>goto :EOF 

Sans les 2 derniers caractères « = », le nombre de caractère de ma valeur Base54 U64 est pas un multiple de 4, donc il ne peut pas être décodé. Nous pouvons voir dans la sortie qu'il fonctionne bien avec p64. usr ne stocke qu'un espace ... Et je veux coller avec un fichier .bat pour l'instant, pas un script .ps1 s'il vous plaît. Merci pour votre aide. J'ai essayé plusieurs combinaisons d'entourage avec "", mais jusqu'ici avec le même résultat.

+1

Ceci n'est pas une question PowerShell. Merci de ne pas utiliser le tag PowerShell. –

+1

Comme nous l'avons déjà mentionné dans le [forum des gars de script] (https://social.technet.microsoft.com/Forums/scriptcenter/en-Us/home?forum=ITCG), votre vie sera plus facile si vous ne le faites pas essayez d'écrire votre script en utilisant le script shell cmd.exe (batch) et utilisez à la place PowerShell. –

+0

malheureusement le code que vous avez proposé dans powershell n'a pas fonctionné. Et j'étais aussi curieux de savoir comment le faire en batch car il fonctionne presque. – julien

Répondre

1

Modification FromBase64String(\"%~2\") à FromBase64String('%~2') résout également le problème dans mes tests. Je ne peux pas dire pourquoi les signes égaux sont convertis en espace, mais je peux dire que dans PowerShell, les chaînes entre guillemets simples sont traitées comme des littéraux, alors que les guillemets doubles permettent d'évaluer le contenu de la chaîne.

partir d'une invite cmd, essayez

powershell "\"$null\"" 

puis essayez

powershell "'$null'" 

et observez le comportement différent.

Vous pouvez également affecter une variable à %~2 dans votre sous-programme de traitement par lots, puis vous y référer dans la portée env: de PowerShell.

:atob <var_to_set> <str> 
set "str=%~2" 
for /f "delims=" %%I in (
    'powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String($env:str))"' 
) do set "%~1=%%I" 
goto :EOF 
+0

J'ai testé la solution que vous avez d'abord mise dans votre commentaire de ma question, qui changeait FromBase64String (\ "% ~ 2 \") en FromBase64String ('% ~ 2') et cela a bien fonctionné. Merci – julien

1

Votre problème n'est pas dans le call, mais dans la façon dont l'analyseur décide de ce qu'il doit gérer en tant que délimiteur lors de la préparation de la commande à exécuter.

Bien qu'il existe quelques options (caractères d'échappement ou expansion retardée) pour ce cas, le plus simple (du point de vue du lot) pourrait être pour envelopper l'accès à la variable à l'intérieur d'un paramètre remplaçable for

:atob <var_to_set> <str> 
    for %%V in ("%~2") do for /f "delims=" %%I in (' 
     powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"%%~V\"))" 
    ') do set "%~1=%%I" 
    goto :EOF 
+0

Merci, ça marche bien maintenant! – julien