2014-02-11 3 views
0

Я все еще довольно новый для powershell, и я все еще пытаюсь учиться.powershell заменить текст на

Вот мой вопрос им работать:

У меня есть куча битых файлов, которые мне нужно заменить с определенным текстом. Только Catch заключается в том, что в тексте есть одна вещь, которую нужно заменить переменной.

Позвольте мне проиллюстрировать:

Printer1.bat Printer2.bat

текст, который необходимо записать:

@echo off 
setlocal EnableDelayedExpansion 

    ::Identify OS 
    for /F "delims=" %%a in ('ver') do set ver=%%a 
    set Version= 
    for %%a in (95=95 98=98 ME=ME NT=NT 2000=2000 5.1.=XP 5.2.=2003 6.0.=Vista 6.1.=7 6.2.=8) 
do  (

if "!Version!" equ "this" (
    set Version=Windows %%a 
) else if "!ver: %%a=!" neq "%ver%" (
      set Version=this 
     ) 
    ) 

    if "!Version!" equ "Windows XP" (

    rundll32 printui.dll,PrintUIEntry /ga /n\\printserver\$printername 
    call P:\Script\wait.cmd 1 
    sc stop spooler 
    call P:\Script\wait.cmd 4 
    sc start spooler 
    call P:\Script\wait.cmd 1 

    ) else echo Scriptet skal ikke kjøres på Windows7 

    Ping –n 5 –w 1 127.0.0.1>null 


    "@ 

Если вы заметили, что переменная $ PrinterName которая на самом деле то же самое имя как имя файла. Так что я хочу переписать файл с текстом, но заменить переменную на имя файла (без .bat)

Не уверен, что вы понимаете, что я пытаюсь сделать.

я знаю, как получить только имя файла без .bat, делая разделенный путь и заменить «»

Ive пытался так много методов, как заявления Foreach. .do while .. ничего не делает правильно

ответ

0

Если вы хотите получить имя файла, без расширения пути или файла, вы можете использовать метод [System.IO.Path]::GetFileNameWithoutExtension для этого. Итак, что-то вроде следующего будет делать трюк:

$batfiles = ls *.bat 

foreach ($file in $batfiles) 
{ 
    $printername = [System.IO.Path]::GetFileNameWithoutExtension($file.Name) 
    $newFileContents = @" 
    [... script content removed for brevity ...] 

    rundll32 printui.dll,PrintUIEntry /ga /n\\printserver\$printername 

    [... script content removed for brevity ...] 
"@ 
    $newFileContents | Set-Content $file.FullName -Encoding UTF8 
} 
+0

Спасибо. Это сделал трюк. Забыл о system.io.path Я не был полностью против своих попыток. Еще раз спасибо – vya

+1

'System.IO.FileInfo'-objects включает в себя свойство' BaseName', которое вы можете использовать вместо 'system.io.path'. Пример: '$ printername = $ file.BaseName' –

+0

Свойство' BaseName' доступно только в том случае, если вы получаете объект FileInfo с помощью 'Get-ChildItem' (который' ls' является псевдонимом для), поскольку это свойство скрипта, добавленное командлетом , Если вы получите список файлов по-другому, например. из любого типа 'System.IO', или если у вас есть только строки с именами файлов, вы не можете использовать' BaseName', но вы можете использовать '[System.IO.Path]'. Однако хорошее предложение, поскольку 'BaseName' делает более короткий код, пока вы получаете объект' FileInfo', используя 'Get-ChildItem'. –

Смежные вопросы