Скрипт Powershell работает в Windows 10, но не 7? - PullRequest
0 голосов
/ 28 сентября 2018

Я не знаю, с чем это связано, кажется, что скрипт работает в Windows 10, но не в Windows 7. Функция, которая создает проблему, - limpia(), которая очищает текст.

Новый файлгенерируется, но кажется, что creplace или replace не работают в Windows 7 - поэтому я получаю тот же файл, но с другим именем.

Любая помощь приветствуется.

$root = [Environment]::GetFolderPath("Desktop")
$folder = 'C:\Users\JuanMa\Desktop\UNB\TMP\'
$filter = 'FACT_TEMPORAL.TXT'

Write-Host "EL ROOT ES $root" -fore white

$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
    IncludeSubdirectories = $true
    NotifyFilter          = [IO.NotifyFilters]'FileName, LastWrite'
}

$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
    $path = $Event.SourceEventArgs.FullPath
    $name = $Event.SourceEventArgs.Name
    $changeType = $Event.SourceEventArgs.ChangeType
    $timeStamp = $Event.TimeGenerated

    Write-Host "The file '$name' at '$path'was $changeType at $timeStamp" -fore white
    limpia
    printpdf
    borrar
    renombra
}

function limpia() {
    write-host "FUNCION LIMPIA ARCHIVO TXT" -fore white 
    $a = get-content $root\UNB\TMP\FACT_TEMPORAL.txt | 
        Foreach-Object { ($_ -creplace '^[.! pÿ>i@]{1,}') } |
        Foreach-Object { ($_ -creplace '^0 {2,}') } |
        Foreach-Object { ($_ -replace '>', '') } |
        Foreach-Object { ($_.TrimEnd() )}  | where {$_ -ne ""} |
        set-content $root\UNB\FINAL_TEXTO\FACT_FINAL.txt
}

function printpdf() {
    write-host "FUNCION IMPRIMIR A PDF" -fore white 
    start-process -filepath "$root\UNB\FINAL_TEXTO\FACT_FINAL.txt" -verb print 
}

function borrar() {
    write-host "FUNCION BORRAR" -fore white 
    Start-Sleep -s 2
    Remove-Item $root\UNB\TMP\FACT_TEMPORAL.txt
}

function renombra() {
    write-host "FUNCION RENOMBRAR ARCHIVO" -fore white   
    Get-Item $root\UNB\FINAL_TEXTO\FACT_FINAL.txt | Rename-Item -NewName {("print-" + '{0:yyyyMMddhhmmss}{1}' -f (Get-Date), ".txt")}
}

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Windows 10 регулярно получает обновления через центр обновлений MS, в настоящее время она использует версию PowerShell:

PS C:\Users\user> $psversiontable

Name                           Value
----                           -----
PSVersion                      5.1.17134.228
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17134.228
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Windows 7 поставляется с версией 2.0 из коробки,Как вы можете видеть в ответе здесь :

PS C:\Users\user> get-host


Name             : ConsoleHost
Version          : 2.0
InstanceId       : 61ef8a3b-0212-4743-87a1-eb2c00fb1e29
UI               : System.Management.Automation.Internal.Host.InternalHostUserI
                   nterface
CurrentCulture   : en-US
CurrentUICulture : en-US
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

Я предлагаю проверить совместимость используемых команд -and либо:

  1. Обновление версии PowerShell.

-или

Перепишите функцию, используя совместимые команды.

РЕДАКТИРОВАТЬ: Мое второе предложение - опробовать инструменты .NET, когда мне не удается выполнить модули powershell.В этом случае я бы попытался заменить -creplace следующим:

function limpia() {
    $regex = [System.Text.RegularExpressions.Regex]
    write-host "FUNCION LIMPIA ARCHIVO TXT" -fore white 
    $a = get-content $root\UNB\TMP\FACT_TEMPORAL.txt | 
        Foreach-Object { $regex::Replace($_, '^[.! pÿ>i@]{1,}', '') } |
        Foreach-Object { $regex::Replace($_, '^0 {2,}', '') } |
        Foreach-Object { $regex::Replace($_, '>', '') } |
        Foreach-Object { ($_.TrimEnd() )}  | Where-Object {$_ -ne ""} |
        set-content $root\UNB\FINAL_TEXTO\FACT_FINAL.txt
}

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

0 голосов
/ 30 сентября 2018

Большое спасибо всем.После обновления и внесения изменений, предложенных в функции limpia, теперь она может работать правильно.

Функция:

function limpia() 
{
    $regex = [System.Text.RegularExpressions.Regex]
    write-host "FUNCION LIMPIA ARCHIVO TXT" -fore white 
    $a = get-content $root\UNB\TMP\FACT_TEMPORAL.txt | 
        Foreach-Object { $regex::Replace($_, '^[.! pÿ>i@]{1,}', '') } |
        Foreach-Object { $regex::Replace($_, '^0 {2,}', '') } |
        Foreach-Object { $regex::Replace($_, '>', '') } |
        Foreach-Object { ($_.TrimEnd() )}  | Where-Object {$_ -ne ""} |
        set-content $root\UNB\FINAL_TEXTO\FACT_FINAL.txt

}

Большое спасибо!

0 голосов
/ 28 сентября 2018

пустых строк в Powershell, таких как "", не очень хорошая попытка с $ null.И посмотрите на синтаксис регулярных выражений в Powershell, возможно, он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...