【问题标题】:Powershell command in a batch file批处理文件中的 Powershell 命令
【发布时间】:2020-09-10 17:04:51
【问题描述】:

晚上好,

我想批量执行以下powershell命令:

$data = Import-Csv C:\Users\powershell\input.txt -delimiter ";" -Header (1..41);1..25 | %{$data[0].($_+16) = $data[$_].16};($data[0] | convertto-csv -delimiter ";" -NoType | select -skip 1) -replace '"' | out-file  C:\Users\powershell\output.txt

为此,我使用以下批次:

@echo off

powershell -Executionpolicy ByPass -Command "$data = Import-Csv C:\Users\powershell\input.txt -delimiter ';' -Header (1..41);1..25 | %{$data[0].($_+16) = $data[$_].16};($data[0] | convertto-csv -delimiter ';' -NoType | select -skip 1) -replace '"' | out-file  C:\Users\powershell\output.txt"

不幸的是,它不能正常工作,执行命令,文件打开但不保存,文件只保存不打开。

谁能告诉我为什么?它是如何正常工作的?

示例输入:

Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;
Klaus;Müller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;

示例输出:

Klaus;Möller;Straße;PLZ;Ort;1;2;3;4;5;6;;;;;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;DE1;

【问题讨论】:

  • 你能给我们看看 csv 文件吗?
  • 我编辑帖子几秒钟...
  • 该命令的问题是out-file 所以尝试使用powershell -Executionpolicy ByPass -Command "$data = Import-Csv C:\Users\powershell\input.txt -delimiter ';' -Header (1..41);1..25 | %{$data[0].($_+16) = $data[$_].16};($data[0] | convertto-csv -delimiter ';' -NoType | select -skip 1) -replace '"' " > C:\Users\powershell\output.txt 代替
  • 当我有你在问题中输入的 csv 文件时,我提供的命令似乎对我有用。它也有预期的输出。
  • 我刚刚测试了它,但不幸的是它对我不起作用。看起来他找不到路径 C:\Users\powershell\input.txt 但文件在那里。

标签: batch-file batch-processing


【解决方案1】:
@echo off

powershell -Executionpolicy ByPass -Command^
 $data = Import-Csv C:\Users\powershell\input.txt -encoding OEM -delimiter ';' -Header (1..41);1..25 ^|^
 %%{$data[0].($_+16) = $data[$_].16};($data[0] ^|^
 convertto-csv -delimiter ';' -NoType ^|^
 select -skip 1^) -replace '\^"' ^|^
 out-file C:\Users\powershell\output.txt -encoding OEM

传递给powershell.exe 的双引号内的双引号可能需要用\ 转义,否则在解析过程中可能会去除内部双引号。批处理文件可能需要用^ 转义双引号。由于问题,决定删除外部双引号并根据需要进行转义。

  • ^ esacape 在行尾是批处理文件中的续行。
  • ^ 在字符之前转义使批处理文件中的字符文字。对于)|中的任何字符。
  • % 在% 之前转义,使批处理文件中的字符文字。不包括可以使用%% 的for 变量。
  • OEM 用于输入和输出的编码与问题中发布的 example-input 匹配。

【讨论】:

    猜你喜欢
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    相关资源
    最近更新 更多