更新 - Å、Ä 和 Ö 违反 PS

更新 - Å、Ä 和 Ö 违反 PS

当我右键单击script.ps1文件并选择“使用 PowerShell 运行”时,会出现一个 PS 控制台窗口,并且我的脚本由于某种原因无法运行。因此我收到错误,但实际上我无法因为错误出现后窗口立即关闭。

因此,我想打开一个新的 PowerShell 控制台窗口,导航到脚本文件,运行它,并希望这次能够读到愚蠢的错误消息。那么如何从控制台窗口运行脚本?

  • 操作系统版本:Windows 8.0
  • PS版本:3.0

简单输入script.ps1或按照建议操作".\script.ps1"根本不起作用。

A

所以我猜它需要获取某种命令?该脚本非常简单,它应该通过读取文件来创建新文件夹并命名它们Export.txt

$folder="C:\test";
$txtFile="C:\test\Export.txt";

get-content $txtFile | %{

    if($_ -match "^(\d+) (\w+)$")
    {
        mkdir "$folder\$_";
    }
}

笔记!请注意,上面的错误消息(屏幕截图)与运行实际脚本无关。我运行脚本的唯一方法是右键单击 Explorer 中的脚本文件并选择“使用 PowerShell 运行”,而运行该脚本时出现的错误是另一个错误,而不是您在上面看到的错误。

更新!请参阅下面的第二条评论。对于类似C:\test\script.ps1这样的路径使用.\script.ps1。当脚本文件的路径包含像Å、Ä 和Ö这样的奇怪字母时,我仍然需要有关运行PS脚本文件的帮助。

更新 - Å、Ä 和 Ö 违反 PS

就像我说的,我似乎在 PS 中对这些字符有问题。这就是为什么我最初认为我做得不对。所以在这里我将举两个例子来说明这一点。

运行不带 Å、Ä 和 Ö 的 PS 脚本

这是我的脚本。

$folder="C:\test";
$txtFile="C:\test\Export.txt";

get-content $txtFile | %{

    if($_ -match "^(\d+) (\w+)$")
    {
        mkdir "$folder\$_";
    }
}

这些是我现在测试的位置的内容。

PS C:\test> dir


    Directory: C:\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2014-02-28     09:12       3648 Export.txt
-a---        2014-02-28     10:49        162 script.ps1


PS C:\test>

这是我从 PS 控制台窗口运行脚本。

PS C:\test> .\script


    Directory: C:\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2014-02-28     10:55            001 Harberget
d----        2014-02-28     10:55            004 Badstuknappen
d----        2014-02-28     10:55            005 Aspberget
d----        2014-02-28     10:55            006 Knipen
d----        2014-02-28     10:55            011 Juberget
d----        2014-02-28     10:55            012 Rangen
d----        2014-02-28     10:55            014 Grasbricka
d----        2014-02-28     10:55            018 Letafors
d----        2014-02-28     10:55            020 Rya
d----        2014-02-28     10:55            022 Bograngen
d----        2014-02-28     10:55            023 Dalby
d----        2014-02-28     10:55            029 Transtrand
d----        2014-02-28     10:55            032 Viggen
d----        2014-02-28     10:55            033 Nyskoga
d----        2014-02-28     10:55            044 Vitsand
d----        2014-02-28     10:55            059 Lekvattnet
d----        2014-02-28     10:55            064 Gustavsfors
d----        2014-02-28     10:55            066 Tyfors
d----        2014-02-28     10:55            067 Mitandersfors
d----        2014-02-28     10:55            070 Bada
d----        2014-02-28     10:55            073 Geijersholm
d----        2014-02-28     10:55            074 Liljendal
d----        2014-02-28     10:55            077 Bogen
d----        2014-02-28     10:55            079 Grinnemo
d----        2014-02-28     10:55            080 Lysvik
d----        2014-02-28     10:55            082 Uddeholm
d----        2014-02-28     10:55            085 Vitklinten
d----        2014-02-28     10:55            086 Gravendal
d----        2014-02-28     10:55            087 Magnor
d----        2014-02-28     10:55            089 Bortan
d----        2014-02-28     10:55            090 Fredros
d----        2014-02-28     10:55            095 Busken
d----        2014-02-28     10:55            101 Charlottenberg
d----        2014-02-28     10:55            102 Allstakan
d----        2014-02-28     10:55            104 Rotten
d----        2014-02-28     10:55            105 Sunne
d----        2014-02-28     10:55            106 Annefors
d----        2014-02-28     10:55            107 Munkfors
d----        2014-02-28     10:55            108 Sunnemo
d----        2014-02-28     10:55            109 Nordmarker
d----        2014-02-28     10:55            111 Silvergruva
d----        2014-02-28     10:55            113 Skillingemark
d----        2014-02-28     10:55            115 Gunnarsskog
d----        2014-02-28     10:55            116 Mangskog
d----        2014-02-28     10:55            118 Rottneros
d----        2014-02-28     10:55            123 Persberget
d----        2014-02-28     10:55            124 Hellefors
d----        2014-02-28     10:55            125 Bottnar
d----        2014-02-28     10:55            128 Ottebol
d----        2014-02-28     10:55            129 Rackstad
d----        2014-02-28     10:55            130 Gullesbyn
d----        2014-02-28     10:55            131 Emtervik
d----        2014-02-28     10:55            135 Brattfors
d----        2014-02-28     10:55            136 Filipstad
d----        2014-02-28     10:55            137 Saxhyttan
d----        2014-02-28     10:55            138 Orrkullen
d----        2014-02-28     10:55            142 Arvika
d----        2014-02-28     10:55            143 Edane
d----        2014-02-28     10:55            144 Brunsberg
d----        2014-02-28     10:55            148 Nyed
d----        2014-02-28     10:55            149 Hedenskog
d----        2014-02-28     10:55            150 Kroppa
d----        2014-02-28     10:55            151 Loka
d----        2014-02-28     10:55            152 Dalen
d----        2014-02-28     10:55            154 Karlanda
d----        2014-02-28     10:55            156 Glava
d----        2014-02-28     10:55            158 Boda
d----        2014-02-28     10:55            159 Frykerud
d----        2014-02-28     10:55            160 Frykestad
d----        2014-02-28     10:55            161 Forshaga
d----        2014-02-28     10:55            164 Storfors
d----        2014-02-28     10:55            167 Holmedal
d----        2014-02-28     10:55            169 Lenungen
d----        2014-02-28     10:55            172 Vermskog
d----        2014-02-28     10:55            173 Edsvalla
d----        2014-02-28     10:55            174 Grava
d----        2014-02-28     10:55            175 Alster
d----        2014-02-28     10:55            176 Glumserud
d----        2014-02-28     10:55            177 Kungskog
d----        2014-02-28     10:55            178 Lundsberg
d----        2014-02-28     10:55            180 Mona
d----        2014-02-28     10:55            181 Foxen
d----        2014-02-28     10:55            182 Silbodal
d----        2014-02-28     10:55            183 Sannaneknatten
d----        2014-02-28     10:55            186 Borgvik
d----        2014-02-28     10:55            187 Grums
d----        2014-02-28     10:55            188 Eriksberg
d----        2014-02-28     10:55            189 Karlstad
d----        2014-02-28     10:55            193 Alkvettern
d----        2014-02-28     10:55            194 Trankil
d----        2014-02-28     10:55            195 Blomskog
d----        2014-02-28     10:55            196 Sillerud
d----        2014-02-28     10:55            198 Gillberga
d----        2014-02-28     10:55            199 Segmon
d----        2014-02-28     10:55            200 Ed
d----        2014-02-28     10:55            204 Presterud
d----        2014-02-28     10:55            205 Kristinehamn
d----        2014-02-28     10:55            207 Salholmen
d----        2014-02-28     10:55            208 Gustavsfors
d----        2014-02-28     10:55            211 Kila
d----        2014-02-28     10:55            212 Hammar
d----        2014-02-28     10:55            215 Skallholmen
d----        2014-02-28     10:55            217 Posseberg
d----        2014-02-28     10:55            219 Degerfors
d----        2014-02-28     10:55            220 Torrskog
d----        2014-02-28     10:55            221 Suled
d----        2014-02-28     10:55            222 Svanskog
d----        2014-02-28     10:55            223 Tveta
d----        2014-02-28     10:55            224 Seffle
d----        2014-02-28     10:55            226 Kilsbyn
d----        2014-02-28     10:55            227 Visnum
d----        2014-02-28     10:55            228 Nysund
d----        2014-02-28     10:55            233 Rudskoga
d----        2014-02-28     10:55            234 Grytfors
d----        2014-02-28     10:55            237 Millesvik
d----        2014-02-28     10:55            240 Rosenborg

显然脚本正在运行。但是,它只创建了 116 个文件夹,而它应该创建总共 245 个文件夹。这可能与脚本本身有关。它跳过了诸如 和 之类的行,002 Långflon因为003 Källegrafsrös它们包含字母 Å、Ä 和/或 Ö。有什么想法吗?但关键是脚本正在 PS 控制台窗口中按预期运行。

使用 Å、Ä 和 Ö 运行相同的 PS 脚本

我故意在文件夹名称中添加了一个 Ä。因此test已重命名为täst。我已使用这些更改更新了脚本文件,现在这是我的脚本。

$folder="C:\täst";
$txtFile="C:\täst\Export.txt";

get-content $txtFile | %{

    if($_ -match "^(\d+) (\w+)$")
    {
        mkdir "$folder\$_";
    }
}

目前测试文件夹中没有文件夹。我已将其删除以重新运行测试。

PS C:\täst> dir


    Directory: C:\täst


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2014-02-28     09:12       3648 Export.txt
-a---        2014-02-28     11:04        164 script.ps1


PS C:\täst>

再次,这是我运行更新后的脚本文件。

PS C:\täst> .\script.ps1
get-content : Cannot find path 'C:\täst\Export.txt' because it does not exist.
At C:\täst\script.ps1:4 char:1
+ get-content $txtFile | %{
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\täst\Export.txt:String) [Get-Content], ItemNotFoun
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand

PS C:\täst>

找不到路径“C:\täst\Export.txt”,因为它不存在。

如您所见,它正在尝试寻找一条不存在的路径。这一点已得到证实。字符 Å、Ä 和 Ö 破坏了 PS!但为什么呢?我到底做错了什么?...

答案1

这里您似乎已设法使用 UTF-8(字符集)输入目录名称:

$folder="C:\täst";

变音符号在脚本中被存储为两个字符。这就是为什么您在错误消息中看到它为两个字符:

get-content : Cannot find path 'C:\täst\Export.txt' because it does not exist.

您究竟是如何“故意在文件夹名称中添加 Ä”的?您需要将其作为 ASCII 而不是 UTF-8 来执行此操作。

使用“type”命令显示您的脚本;我确信您将看到错误消息中的 UTF 表示。您的编辑器会按您的预期为您显示变音符号。type 命令将 [最有可能] 将变音符号显示为两个字符,如错误消息中所示。

确保您的编辑器保存的是纯 ASCII 或 ANSI。

答案2

运行 PowerShell 脚本

假设您有一个名为的 PowerShell 脚本my script.ps1存储在 中C:\Some folder。要运行它,您可以:

  • 导航到实际路径,然后执行:

     cd "C:\Some folder"
     & ".\my script.ps1"
    
  • 直接指定完整路径来执行:

     & "C:\Some folder\my script.ps1"
    

&是个呼叫接线员。或者,您可以从常规命令提示符启动它:

powershell -ExecutionPolicy Bypass -NoLogo -NoProfile -File "C:\Some folder\my script.ps1"

修复脚本

我重写了脚本,以便它接受两个参数:输入文件(假定为以 UTF-8 保存的文本)和目标文件夹。当未指定编码时,它将默认为 ASCII。

if ($args.Count -gt 1)
{
    $file=$args[0];
    $dest=$args[1];
    Get-Content $file -Encoding UTF8 | %{ md "$dest\$_" >$null; }
}

参考

答案3

您必须将文件保存为带 BOM 的 UTF-8 - 您可以使用 Notepad++。Powershell 已损坏,无法可靠地读取不带 BOM 的 UTF-8 文件 - 自己想想吧。

与上述相同的问题+解决方案:https://stackoverflow.com/a/14482588/1819480

相关内容