批处理文件中的 Powershell:错误和未执行的命令

Powershell in Batch file: Errors and Commands not executing

您可以在下面找到我将使用的两个示例文本文件的内容,example1.txtobf_example1.txt。后者在文件末尾包含 example1.txt 的字符串,但之前有一些混淆的字符串。

example1.txt:

adasdkasdaksdasdkjlasdjasndjasd.

obf_example1.txt:

ŠxpÃÒ²Ø-Gêÿ ój"f>ïí   H€À(ø4$/+#6Ni9Pvü¶ |CF CÀ¾ý~ª-°à9ÉOÿ V[o¦.E…-Š  ƒ9Ú\žê*D´ß()^“£¹ìÅjXÑÍ¥â(¨µ×d'«P|I*èSººº&)Ø|̉ òÔ®¥Ô$LÁ:9ŠLá{¶nZÒØ¨NÙÀØŒ‹0õ´Sék›áÇÉîÆbËF§BЄƒöZKaÒR ²°ÅšDn?+¶()IªP›$ÇEv©¡k€[ßè¨×q-Ëk!µTóPA²—: A ?ÉEEEGÐJúÌ©ÒWµHB¡aäXû|ÓË BPÁwr„Ûi¥åܺÈQ÷ORàSb,Šv¢D ,Žb’(2 öb¢wtKzíĦ#ï¯u©²Ù  aîR隬ëÌTbà÷¥3ÄtSGì´R$)X   Šù
'¹¨D³ÞeOK3!{·‹¦cäиNÅô:Na1žAÇ1ø8 &Fuôë %¸T¯_òMå†C"ý¤F   ™º„Iµºí4Ü¡ˆc!ì•+3 ‰‹M K@JÁ«8¢bsL†!Ù“à­šn·öM啌&ýèvÀ}¨?¦hùÊò(É@Žf~5‰‘qØçþƒ‰Å²ÓÖÊJU•âNWÁ«L¼Y”$G¢ßè&§ÖÉØŒS‘WàË„°SØW Ð¨´_è%‚Å¢ø.ãÃð”#X^þ*1þ‚q85¡lÒ‚Ò>‘¸ÿ £ôQôz#ø¤ÎõÚªï|Xö%;åÍËûGú+îUƒö³‰›p    U±Ò ðtÜGÜÿ  ð,åXÿ k8È I”ÿ “½¿Ð`¨u5=SÓqyFÈ É8ôã¨ð£è6’H@lÄI10‚Ö§ÑdµÖ?t¡]D†9Zj,¥EɺÜEq¤@,ìn—¢º‚´€bc·ú¨Lû£ÿ Ó×ÿÙ||adasdkasdaksdasdkjlasdjasndjasd.

当我在批处理文件中 运行 example.txt 的以下 powershell 命令时,它起作用了,我得到了 example.txt:

的输出
@echo off
for /f "delims=" %%a in ('powershell Get-Content .\example.txt') do set _output=%%a
echo %_output%

adasdkasdaksdasdkjlasdjasndjasd

到目前为止还不错。

但是,当我 运行 上述 obf_example1.txt 的 powershell 命令时,它不起作用并且我收到以下错误消息:

'¹¨D³ÃzeOK3!{·â?¹Â¦cäÃ?Â?¸Â?NÃ.ô:Na1žAÃ╬1ø8 
The command "FuôëÂ" is either misspelled or could not be found.
The command "ýèvÃ?}¨?¦hùÃSÂ?ò" is either misspelled or could not be found.

为什么?没关系我想:因为我只对 example1.txtobf_example1.txt 中的最后 n 个字符感兴趣,所以我的想法是提取最后的 n 个字符并检查是否然后我可以看到 obf_example1.txt 的输出。为了检查我的想法是否可行,我 运行 以下命令 example1.txt 以获取最后 4 个字符为例:

@echo off
for /f "delims=" %%a in ('powershell $a=Get-Content .\example.txt; $a.substring^(0,$a.length-4^)') do set _output=%%a
echo.%_output%

虽然它没有显示任何内容。 %_output% 好像是空的。如何解决?固定版本是否也适用于 obf_example1.txt 以便我在那里得到输出而不是上面的错误消息?

显然,您要查找的文本在 || 后面。

借助 PowerShell,您可以使用

轻松获得它
((Get-Content 'D:\Test\obf_example1.txt' -Raw) -split '\|\|')[-1]

Returns

adasdkasdaksdasdkjlasdjasndjasd

这不就是你想要的吗?

以下对我来说是为了在 || 之后得到 "clear-text" 部分(来自你的例子):

for /f "delims=" %%a in (.\obf_example1.txt) do set "_output=%%a"
set _output
echo testing last 10: %_output:~-10%
set "_output=%_output:*||=%"
set _output
echo %_output%

(它可能不适用于文本文件的不同编码)

(考虑 Powershell - cmd 对行长度有限制,很容易被淹没)

如果您确实是从显然不是文本文件的文件中获取文本字符,您可以尝试读取最后 4 个字节。 (我的猜测是它是隐藏在二进制文件中的文本,可能是图形文件).

@For /F Delims^=^ EOL^= %%G In (
 '%__AppDir__%WindowsPowerShell\v1.0\powershell.exe  -NoP^
 "$f=[IO.File]::OpenRead('C:\Users\Ferit\Desktop\obf_example1.txt');"^
 "$f.Seek(-4,[System.IO.SeekOrigin]::End)|Out-Null;$buffer=new-object Byte[] 4;"^
 "$f.Read($buffer,0,4)|Out-Null;$f.Close();"^
 "[System.Text.Encoding]::UTF8.GetString($buffer)"')Do @Set "_output=%%G"
@Set _output 2>NUL&&Pause

不要忘记修改文本文件路径,(在线3,如果你想要更多,4的三个实例或更少的字节。包含最后一行只是为了向您展示输出,(您显然会用自己的代码替换它).