批处理文件中的 Powershell:错误和未执行的命令
Powershell in Batch file: Errors and Commands not executing
您可以在下面找到我将使用的两个示例文本文件的内容,example1.txt
和 obf_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.txt
和 obf_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
的三个实例或更少的字节。包含最后一行只是为了向您展示输出,(您显然会用自己的代码替换它).
您可以在下面找到我将使用的两个示例文本文件的内容,example1.txt
和 obf_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.txt
和 obf_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
的三个实例或更少的字节。包含最后一行只是为了向您展示输出,(您显然会用自己的代码替换它).