Powershell脚本可以在Windows 10中运行但不能在Windows 7中运行

时间:2018-09-28 05:45:21

标签: powershell

我不知道是什么原因造成的,该脚本似乎在Windows 10上有效,但在Windows 7上却不起作用。正在产生问题的函数是limpia(),它可以清除文本。

新文件已生成,但creplacereplace在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 :(得分:0)

在Powershell中使用

空字符串(例如“”)不是很好,尝试使用$ null。 并查看Powershell中的正则表达式语法,也许比它应该起作用。

答案 1 :(得分:0)

Windows 10 通过MS更新中心进行常规更新,当前使用PowerShell版本:

following-sibling::div[1][@class="reply"]

Windows 7 开箱即用。正如您在答案右侧here中看到的:

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

我的建议是检查-和使用的命令的兼容性:

  1. 升级powershell版本。

-或

  1. 使用兼容命令重写功能。

编辑: 我的第二个建议是,每当Powershell模块使我失败时,请尝试.NET工具。在这种情况下,我会尝试用-creplace代替:

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

我还没有检查过模式,您将不得不自己做。由于我不知道文件结构,因此无法给您一个更好的答案,似乎您可以只使用一个foreach循环和一个正则表达式来清理文件。

答案 2 :(得分:0)

非常感谢大家。升级并执行了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

}

非常感谢!