PowerShell scriptBlock оборачивает скрипт при попытке записать блок скрипта в файл

Я пытаюсь создать сценарий PowerShell с помощью другого сценария PowerShell. У меня есть что-то вроде: >

    $scriptBlock = {
    write-host "this is the body of the script that I want to add to another PS script"
    if($true){
     write-host "so that I can execute this automatically created script somewhere "
        }
    }
    $scriptBlock | Out-String -Width 4096 | Out-File "c:\test.ps1"

AtRunUnattended.exe "$($Dict.Get_Item("MASTER_DIRECTORY_PATH"))\MEDIA_FILE\" /S /noreboot /L logfile="%TEMP%\AT $($Dict.Get_Item("PRODUCT_NAME")) V8.4. log" altsource="C:\temp\baf\mediafile"

Однако, когда у меня есть несколько длинных однострочных скриптов, таких как показанный выше, он автоматически упаковывается, поэтому выходной файл .ps1 не будет работать, как если бы я вызывал скрипт непосредственно из родительского скрипта. Таким образом, в файле .ps1, созданном родительским скриптом .ps1, код выглядит следующим образом:

ElseIf($str.StartsWith("DRIVER_DATE=")){$str = "DRIVER_DATE=$(Get-Date 
-f MM-dd-yyyy))"}

который не будет работать должным образом, если он будет запущен.

Итак, кто-нибудь знает, как форматировать текстовые блоки сценариев, чтобы их можно было правильно записать в другой дочерний файл сценария для дальнейшего выполнения? Я провел небольшое исследование и думаю, что это может иметь какое-то отношение к ширине внутреннего текстового буфера PS или что-то в этом роде. Я также пробовал другие методы вывода файлов, такие как [System.IO.StreamWriter], однако все они выглядят одинаково — обернуты и ограничены определенной шириной строки.

Пожалуйста, помогите мне, спасибо!

Вся цель этой штуки состоит в том, чтобы автоматически генерировать некоторые скрипты и удаленно выполнять эти созданные скрипты на других машинах.


person FrozenLand    schedule 23.09.2013    source источник
comment
Вы пытались использовать оператор -Width с командой Out-File?   -  person Musaab Al-Okaidi    schedule 23.09.2013
comment
@Мусааб Спасибо! Я попробовал, и это сработало. Кроме того, в каких единицах измеряется эта ширина? Количество символов? Байты?   -  person FrozenLand    schedule 23.09.2013
comment
Я опубликую как ответ, и я ценю, если вы можете выбрать его как правильный ответ. Что касается оператора Width, да, это количество символов, как вы можете видеть здесь: technet.microsoft.com/en-us/library/hh849882.aspx   -  person Musaab Al-Okaidi    schedule 23.09.2013


Ответы (2)


Используйте параметр -Width с командлетом Out-File следующим образом:

Out-File -FilePath "c:\test.ps1"  -Width 4096
person Musaab Al-Okaidi    schedule 23.09.2013
comment
Есть ли для этого верхний предел? Является ли 4096 безопасным значением параметра ширины? У меня нет сумасшедшего кода, но я хочу убедиться, что может поместиться строка длиной около 500 символов. - person FrozenLand; 23.09.2013
comment
Хороший вопрос, но я не слишком уверен, каким будет верхний предел. Чтобы всегда указывать правильное число, вы можете установить размер ширины в соответствии с длиной символов блока скрипта следующим образом: -Width $ScriptBlock.ToString().Length - person Musaab Al-Okaidi; 23.09.2013
comment
Ширина не равна длине? Каждая строка моего блока сценария может быть длинной, но я знаю, что они не будут длиннее, чем самое большее 1000. Однако весь блок может быть неопределенно длинным, поэтому я надеюсь, что ширина не имеет ничего общего с длиной. - person FrozenLand; 23.09.2013
comment
Да, ты прав. То, что я сказал, применимо только в том случае, если вы используете однострочные блоки скриптов. - person Musaab Al-Okaidi; 24.09.2013

переменная не будет раскрыта в одинарной кавычке. Может быть, вам нужен образец, как это:

$scripts=@'
$date=get-date
"Hello,now is $date"
'@

$scripts | Out-File second.ps1
./second.ps1 

Выход:

Hello,now is 09/23/2013 23:41:18
person Mosser Lee    schedule 23.09.2013
comment
Спасибо. Однако проблема, с которой я сталкиваюсь, заключается в том, что когда у меня есть что-то вроде: › dostuff.exe -option1 sss -option2 sss .... вплоть до option99 (просто пример), если каждая опция и ее аргумент относительно длинные и занимать примерно длину внутреннего буфера строк, то все опции в результирующем файле .ps1 будут записаны в отдельные строки, что сделает скрипт невыполнимым. - person FrozenLand; 23.09.2013