从 powershell 加密时如何分隔 .bat 行

How to seperate lines of .bat when encrypted from powershell

我有一个 10KB 的 powershell 脚本,我正在尝试将其转换为 .bat。脚本的格式是 1. 声明常量 2. 一堆 for each child item 循环涉及发送电子邮件和移动文件。我制作的其他 bat 文件可以正常工作。

有 6 个非嵌套循环。 当每个循环的 bat 单独运行时(使用声明),一切正常。当我组合 3 时,一组工作,另一组发送电子邮件而不移动文件。当所有组合在一起时,没有任何效果,命令提示符 window 甚至不会弹出。

我读到 bat 文件的行长度限制为 127 字节 (http://support.microsoft.com/kb/69563),我认为这就是我遇到问题的原因。我是否需要在 powershell 中做一些事情来分隔行,这样 bat 文件就不会尝试将其作为一行来读取?

为了转换,我使用了这里的脚本 (http://www.altitudeintegration.com/PowerShellToBatFile.aspx)

您最初是否编写了 bat 文件的脚本或代码?

如果没有,你能把那个文件从备份中拉出来吗?

我知道我们曾经对 KiX 脚本进行编码,所以您应该拥有魔法解码器环。就个人而言,我会非常小心地编码您的脚本,除非它们包含登录凭据。除此之外,我会将它们保留为原始文本。

谢谢!

您可以使用

从批处理文件调用原始 PowerShell 脚本

powershell.exe -ExecutionPolicy RemoteSigned -File myscript.ps1

这样您就可以通过双击批处理文件来使用您的脚本。

ExecutionPolicy参数可用于允许脚本运行,而不改变机器级别ExecutionPolicy:

Sets the default execution policy for the current session and saves it in the $env:PSExecutionPolicyPreference environment variable. This parameter does not change the Windows PowerShell execution policy that is set in the registry.

这样就不需要将 PowerShell 脚本转换为批处理(这可能根本不可能)。

您可以在命令提示符下使用 powershell.exe /? 来发现它的所有选项。

请注意,PowerShell 默认将 ExecutionPolicy 设置为 RestrictedRemoteSigned in Windows Server 2012 R2)。在机器范围内更改机器范围的策略需要本地管理员权限。

powershell.exe 上使用 -ExecutionPolicy 参数仅设置本地范围的执行策略。

使用

查看有关 ExecutionPolicy 的更多详细信息

Get-Help about_Execution_Policies

或看这里http://technet.microsoft.com/en-US/library/hh847748.aspx

您可以在

中找到PowerShell.exe可执行文件

C:\Windows\System32\WindowsPowerShell\v1.0\powersell.exe

(参见:Path to Powershell.exe (v 2.0)

这不是您问题的全部答案,但我特别想解决您的 127 字节断言。这对于 16 位 DOS 可能是正确的,但 cmd.exe 没有这样的限制。

测试用例:

@echo off
setlocal

set "longline=############################################################################################################################################################################################################################################################################################################"

call :length %longline% len

echo longline is %len% bytes

:: end main script
goto :EOF

:length <string> <var_to_set>
setlocal enabledelayedexpansion
set "str=%~1"
for /l %%I in (1,1,1000) do (
    if "!str!"=="!str:~-%%I!" (
        endlocal && set "%~2=%%I"
        goto :EOF
    )
)

输出:

longline is 300 bytes