![更新 - Å、Ä 和 Ö 违反 PS](https://linux22.com/image/1399566/%E6%9B%B4%E6%96%B0%20-%20%C3%85%E3%80%81%C3%84%20%E5%92%8C%20%C3%96%20%E8%BF%9D%E5%8F%8D%20PS.png)
当我右键单击script.ps1
文件并选择“使用 PowerShell 运行”时,会出现一个 PS 控制台窗口,并且我的脚本由于某种原因无法运行。因此我收到错误,但实际上我无法读因为错误出现后窗口立即关闭。
因此,我想打开一个新的 PowerShell 控制台窗口,导航到脚本文件,运行它,并希望这次能够读到愚蠢的错误消息。那么如何从控制台窗口运行脚本?
- 操作系统版本:Windows 8.0
- PS版本:3.0
简单输入script.ps1
或按照建议操作".\script.ps1"
根本不起作用。
所以我猜它需要获取某种命令?该脚本非常简单,它应该通过读取文件来创建新文件夹并命名它们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